一、单源最短路回顾
我们在求单源最短路径的时候,设
u
→
v
u→v
u→v之间有一条有向边
(
u
,
v
,
w
)
(u,v,w)
(u,v,w),由于只有当
d
i
s
[
v
]
dis[v]
dis[v]能减小的时候才会被更新,因此则当
v
v
v被
u
u
u更新后一定满足关系式:
d
i
s
[
v
]
≤
d
i
s
[
u
]
+
w
dis[v]\le dis[u]+w
dis[v]≤dis[u]+w。
而一个图中有若干条这样的有向边,因此也就等价于有多个这样的不等式,利用最短路算法求解这样的不等式组即为差分约束。
二、差分约束的应用
1.求不等式组的可行解
源点需要满足的条件:从源点出发,一定可以走到所有的边。
步骤:
- 先将每个不等式 x i ≤ x j + c i x_i\le x_j+c_i xi≤xj+ci转化成一条从 x j x_j xj走到 x i x_i xi,长度为 c i c_i ci的一条有向边
- 找一个超级源点,使得该源点一定可以遍历到所有边
- 以源点为起点求一遍单源最短路,如果存在负环,则原不等式组一定无解;如果没有负环,则 d i s [ i ] dis[i] dis[i]就是原不等式组的一个可行解
求形如 x i ≥ x j + c i x_i\ge x_j+c_i xi≥xj+ci的不等式组则求最长路,出现正环则无解。
2.求每个变量的最大值或最小值
结论:如果求的是最小值 ,则应该求最长路;如果求的是最大值,则应该求最短路。
求最值问题中一定存在某个形如 x i ≤ C x_i\le C xi≤C的一个方程,其中 C C C是一个常数,如何表示这类不等式呢?可以设一个超级源点值为 0 0 0,则原式变为 x i ≤ x 0 + C x_i\le x_0+C xi≤x0+C,因此建立一条 0 → x i 0→x_i 0→xi长度为 C C C的边即可。
这里以求 x i x_i xi的最大值为例:求所有从 x i x_i xi出发,构成的不等式链 x i ≤ x j + c 1 ≤ x k + c 2 + c 1 ≤ ⋯ ≤ c 1 + c 2 + ⋯ + c n x_i\le x_j+c_1\le x_k+c_2+c_1\le \dots \le c_1+c_2+\dots +c_n xi≤xj+c1≤xk+c2+c1≤⋯≤c1+c2+⋯+cn所计算出的上界(形如 x ≤ C x\le C x≤C),最终 x i x_i xi的最大值等于所有上界的最小值(即若 x ≤ 5 , x ≤ 2 , x ≤ 3 x\le 5,x\le 2, x\le 3 x≤5,x≤2,x≤3,那么 x ≤ 2 x\le 2 x≤2)。
求最大值的分析过程同理。