差分约束
算法相关
SPFA
用队列维护已被松弛过的点,每次用队首的元素进行下一轮松弛。
负环
判断负环
维护 \(cnt_x\) 表示点 \(x\) 入队的次数,若存在点 \(x\) 使得 \(cnt_x > n\) 则该图存在负环。
负环上的点
记 \(pre_x\) 表示点 \(x\) 被哪个点松弛。那么从一个点 \(x\) 满足 \(cnt_x > n\) 开始一直 \(pre_x \to x\),执行 \(n\) 次,最后 \(x\) 一定在负环上。(环上至多 \(n\) 个点)
差分约束
一般问题是求解由若干个变量 \(x_i\) 和不等式 \(x_i - x_j \le c_k\) 组成的不等式组。
在差分约束中,无论约束条件是 \(x_i - x_j \geq c\) 还是 \(x_i - x_j \le c\),我们都建立一条 \(j \to i\) 边权为 \(c\) 的边。若将约束条件全部转为上界约束,则是跑最短路,无解则是存在负环,用来求解最大化问题;若全部转为下界约束,则是跑最长路,无解则是存在正环,用来求解最小化问题。
习题
P1339 [USACO09OCT] Heat Wave G
模板。
P3385 【模板】负环
模板。
T560635 单源最短路径
模板。
CSES 1197
模板。
CSES 1673
模板。
P5960 【模板】差分约束
模板。
P1993 小 K 的农场
思路
对于 \(x_i = x_j + c_k\) 的建图手法:转化为 \(x_i \le x_j + c_k\) 和 \(x_j \le x_i - c_k\)。
P2294 [HNOI2005] 狡猾的商人
思路
转化为前缀和。
P4926 [1007] 倍杀测量者
简要题意
给出不等式组,每个不等式形如:
求出最大的 \(t\) 使得不等式无解。
思路
乘法不等式的经典手法是取对数,不妨只对第一类不等式考虑,则该不等式转化为:
由于 \(\log\) 的单调性和差分约束只会约束上界或者下界,所以 \(t\) 是具有单调性的,可以二分答案。
ABC - G - Specified Range Sums
思路
依旧是刻画到前缀和上,对于正整数这一限制,额外约束 \(x_i - x_{i - 1} \ge 1\) 即可。因为要求最小序列和,因此转化为上界约束跑最短路即可。
P4878 [USACO05DEC] Layout G
思路
同样的转化为上界约束跑最短路。
可以跑两次 SPFA,第一次判无解,第二次求答案即可。
P3530 [POI 2012] FES-Festival
简要题意
给定不等式组,每个不等式形如:
求 \(x\) 的所有解中出现过的数字有多少个。
思路
依然把等式拆分成不等式进行上界约束,可以 \(a \to b\) 边权为 \(-1\),\(b \to a\) 边权为 \(1\) 建边。
那么出现负环则无解,考虑用 Floyd 求最短路。记 \(dis_{i, j}\) 表示 \(i \rightsquigarrow j\) 的最短路。出现负环当且仅当 \(dis_{i, i} < 0\)。
同时因为是上界约束,有:\(x_i - x_j \le dis_{i, j}\)。
考虑一个 SCC \(S\)。记 \(D = \max_{i, j \in S} dis_{i, j}\)。
- \(S\) 中的答案为 \(D + 1\)。
证明:令 \(S\) 中最小最大的点为 \(u, v\),则:\(x_u - x_v \le dis_{u, v} \le D\)。由于 \(x_i\) 为整数,因此答案上界是 \(D + 1\)。选择满足 \(dis_{s, t} = D\) 的点对 \((s, t)\),给 \(S\) 中每个点 \(u\) 赋值 \(x_u \to dis_{s, u}\)。则该构造一定合法并且 \(x_s = 0, x_t = D\)。由于图上的边权集合为 \(\{ 0, 1, -1 \}\),因此 \(0 \sim D\) 中每一个值都能被选中。
- 答案为各个 SCC 中的答案之和。
证明:缩点后得到一个 DAG。并且,SCC 之间只可能存在权值为 \(0\) 的边,因为其它边对应双向边,两端点一定同属一个 SCC。一个 SCC 内的变量全部加上同一个数还会是一组合法解,因此按拓扑序对于每个 SCC 的所有变量赋值一定可以构造一组解使得各个 SCC 的答案无交。
记 \(S\) 为一个强连通分量,\(G\) 为原图,则答案为:

浙公网安备 33010602011771号