差分约束:所解决的问题给定很多不等式组形如 xixj+ckx_i \leq x_j + c_k,找到 xx 的可行解。


  1. 对于每个不等式xixj+ckx_i x_j + c_k 都转化成一条从 xjx_j 走到 xix_i 边权为 ckc_k

  2. 然后找一个源点 (对于这个点必选能够走到所有边),跑一边最短路(最长路)算法。

    1. 最短路:对于 jij \to i 求之前,d[i]>d[j]+cd[i] > d[j] + c。求之后,d[i]d[j]+cd[i] \leq d[j] + c;

    • 一个图里每个点求完最短距离后每个点的最短距离都有第二个不等式满足

    • 即 任何一个最短路问题 可以 转化为一个差分约束问题

    • 同理 一个差分约束问题 可以 转化为一个单源最短路问题

    1. 最长路:对于 jij \to i 求之前,d[i]<d[j]+cd[i] < d[j] + c。求之后,d[i]d[j]+cd[i] \geq d[j] + c;
  3. 无解情况:

    • 假设存在一个负环,既有12...k1,i=1kci=C,C<01 \to 2 \to ... \to k \to 1, \sum\limits_{i=1}^kc_i = C, C < 0
    • 也就是 x2x1+c1,x1xk+ck,...,x3x2+c2x_2 \leq x_1 + c1, x_1 \leq x_k + c_k, ..., x_3 \leq x_2 + c_2
    • 所以 x2x1+c1xk+c1+ck...x2+Cx_2 \leq x_1 + c_1 \leq x_k + c_1 + c_k \leq ... \leq x_2 + C
    • 又因为 C<0C < 0
    • 所以就有矛盾 x2<x2x_2 < x_2
    • 综上,对于最短路存在负环,差分约束为题也就无解,同理对于最长路存在正环,差分约束为题也就无解。
  4. 差分约束求可行解的最小值或者最大值

    • 结论:求最小值用最长路,求最大值用最短路。
    • 证明:以求最大值为例。对于每个 xixj+ck...x0+Cx_i \leq x_j + c_k \leq ... \leq x_0 + C,对于 xix0+Cx_i \leq x_0 + C 有多个不等式,其中右边是常数(x0x_0 表示源点,一般初始值是一个常数),也就是x_i <= x_0 + C 都成立,x_i 一定是小于等于所有常数中的最小值,x0+Cx_0 + C 表示的就是从 00 走到 ii 的距离,也就对应求短源最短的最小值。