差分约束

算法相关

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] 倍杀测量者

简要题意

给出不等式组,每个不等式形如:

\[x_a \ge (k_i - t) \times x_b \]

\[(k_i + t) \times x_a > x_b \]

求出最大的 \(t\) 使得不等式无解。

思路

乘法不等式的经典手法是取对数,不妨只对第一类不等式考虑,则该不等式转化为:

\[\log x_a \ge \log(k_i - t) + \log x_b \]

由于 \(\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 = x_b + 1 \]

\[x_a \le x_b \]

求 \(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\) 为原图,则答案为:

\[\sum_{S \subseteq G} \max_{u, v \in S} \{dis_{u, v} + 1\} \]

posted @ 2026-09-13 14:49  endswitch  阅读(12)  评论(0)    收藏  举报