本讲定位:图论系列番外 A。前 16 讲处理的题目,题面里都明明白白写着”点”“边”“路径”“连通”。本讲处理的是另一类题——题面里一个图字都没有:一边是”甲比乙至少多 3 个”这样的不等式组,一边是”每人只能二选一,且这两个选择不能同时成立”这样的布尔约束。它们的共同点是,只要建对了图,剩下的部分全是前面讲过的模板:差分约束靠第 06 讲的负环判定,2-SAT 靠第 13 讲的 Tarjan 缩点。本讲的全部难度都在”翻译”这一步,所以每一节都会把”题面的一句中文 → 一条边”这个映射写清楚。
本讲实测:2-SAT 部分与 $2^n$ 暴力对拍 4 万组,正确写法零错误;只建单向边(忘记对称的蕴含边)合计错 34.21%,最小反例只有 1 个子句;取值方向反的判定 100% 正确、方案却在有解样本里 79.56% 非法——这是”样例能过、大数据全 WA”的经典来源。差分约束部分与穷举解空间的暴力对拍 2 万组,超级源点写法零错误,只从 1 号点跑错 52.53%(随机约束图里 1 号点到不了全图的比例高达 79.89%),边的方向建反错 30.93%。另外测出一条与第 06 讲结论相反的事实:判负环在差分约束题上不该首选 DFS 版——在”有解”(即无负环)的数据上,$n=5000$ 时 DFS 版随边数从 $m=n$ 的 1.1 倍一路劣化到 $m=6n$ 的 818 倍。文中所有带
int main的完整程序均经g++ -std=c++11 -Wall编译运行,文中标注的输出就是实测输出。
前置:第 01 讲(存图)、第 06 讲(Bellman-Ford / SPFA / 判负环)、第 13 讲(Tarjan 缩点、SCC 编号即逆拓扑序)。这两块是硬前置,没学过的话本讲的后半会完全看不懂。
适合对象:标 S⭐⭐。差分约束在 CSP-S 复赛属于”几年出现一次、出现即送分”的类型;2-SAT 在 CSP-S 几乎只在初赛的概念题里露面。本讲的定位是选修——但它是全系列”建模”这条线的终点,第 08 讲教你把题目翻译成最短路,这一讲教你把不等式和逻辑翻译成图。
题目一(P1993 小 K 的农场):$n$ 个农场,给出 $m$ 条信息,每条是下面三种之一:
问:存不存在一种种植方案,同时满足所有信息?
题目二(P4782 【模板】2-SAT):$n$ 个布尔变量 $x_1 \sim x_n$,$m$ 个条件,每个条件形如”$x_i$ 为 $a$ 或 $x_j$ 为 $b$“。问有没有一组赋值让所有条件同时成立,有的话给出一组。
这两道题,一道是不等式组,一道是逻辑约束,看上去和图论毫无关系。但它们各自有一句”咒语”,念完就变成了图论题:
本讲的全部内容,就是把这两句话讲透,然后各自接上一个前面已经写过的模板。
给一组形如
$$ x_v - x_u \le w $$