差分约束的应用
目录
1,求不等式组的可行解
有n 个不等式,每个不等式都形如 Xi <= Xj + Ck, 其中 Xi 与 Xj 为变量, Ck为常数
差分约束的算法可以求出不等式的一组可行解。
原理
Xi <= Xj + Ck
类比最短路的三角不等式,求完最短路(例如Dijkstra)对于每条边来说存在一条边,存在一条边从 j 走到 i 长度为 c在求完最短路之后,必然有dist[ i ] <= dist[ j] + c(最短路存在,且没有负环). 对于每条边都存在这个不等式。求完之后,每个点到源点的距离都满足这个不等式。所以我们可以把从 j 到 i 长度为 c 的边可以看作一个不等式 Xi <= Xj + c, 只要图不存在负环,求完不等式,每个Xi都满足不等式。给个图我们可以把每个边看作一个不等式,在图上求每个点到源点的最短距离,求完之后,每个边都满足的不等式。
所以任何一个最短路的问题都可以变成一个差分约束的问题,一个不等式组的问题。反之,对于不等式组的每个不等式,我们都可以把他看成一个从 j 走到 i 长度 为Ck的边。在图上随便选一个起点,然后求一下每个点到起点的最短距离,每个点满足不等式。所以每个差分约束的问题都可以转化为图论的最短路的问题。
因此当我们想求可行解的时候,我们把不等式组里的每个不等式,转化成一条边,然后在这个图上求某一个点的单源最短路径,求完之后必然满足限制条件,即得到可行解。
做法
源点的条件:我们的源点必须满足从源点出发一定可以走到所有的边,
原理:只有从源点出发可以到达的边,我们最终才可以满足不等式,某一个点不能走到无所谓(某个点走不到代表它不受限制,x[ i ]取任意值都可以)
过程
1 , 先把每个不等式 Xi <= Xj + Ck不等式转化为一条从 X[ j ] 到 X[ i ] 长度为 c 的边
2, 在这张图上找到一个超级源点,使得该源点一定可以遍历到所有的边。
3, 从源点求一遍 单源最短路
结果1 :如果存在负环,则原不等式组一定无解。
结果2:如果没有负环,则dist[ i ] 就原不等式组的一个可行解。
问题 : 并不是所有的图都存在最短路。
如果存在负环
x[1]→x[2]→x[3]→x[4]
↑ c1 c2 c3 ↓
← ← ← ← ← ←
c4
x[2] <= x[1] + c1
x[3] <= x[2] + c2
x[4] <= x[3] + c3
x[1] <= x[4] + c4
即 x[2] <= x[2] + c1 + c2 + c3 + c4
因存在负环即 c1 + c2 + c3 + c4 < 0
即 x[ 2 ] < x[ 2 ] 矛盾
得出结论:不等式无解 <=> 存在负环
当然最长路也是可以求可行解的
类比最短路
i ——> j 求之前可能 d[ j ] > d[ i ] + c
求之后一定 d[ j ] <= d[ i ] + c
最长路
i——> j 求之前 可能 d[ j ] < d[ i ] + c
求之后一定 d[ j ] >= d[ i ] + c
最长路结果
结果1 :如果存在正环,则原不等式组一定无解。
结果2:如果没有正环,则dist[ i ] 就原不等式组的一个可行解。
2,如何求最大值或者最小值,这里的最值指的是每个变量的最值
结论
如果求的是最小值,则应该求最长路;如果求的是最大值,则应该求最短路。
原理做法
如果要求最大值或者最小值,则其中一个变量肯定有一个限制(比如 Xi >= 0,或者Xi = Ci),如果没有限制则不等式之间都是相对大小,没有绝对关系。
比如 不等式组有一个限制 Xi >= 0,那么我们怎么把这个性质变为一个边。
问题1:如何转化 Xi <= c (c为常数)这类问题
常规做法:建立一个超级源点,0号点。然后建立从0到 i 长度为c的边即可。
对于Xi <= c 这类不等式, 我们把它转化为 Xi <= X0 + c ,X0是0
求最值肯定有一个源点要不然都是相对的大小,没有绝对的大小。
以求x[ i ]的最大值为例:所有从x [ i ] 出发,构成的不等式链
x[i] ≤ x[j] + c[j]
≤ x[k] + c[k] + c[j]
≤ x[0] + c[1]+ c[2]+... + c[j]
= 0 + c[1]+ ... + c[j]
所计算出的上界,
最终x[i]的最大值
=所有上界的最小值
结论
那么
求x[i]最大值
等价于
求所有上界的最小值
等价于
求所有从0→i的路径和的最小值
等价于
最短路求dist[i]
同理 求x[i]最小值
等价于
求所有下界的最大值
等价于
求所有从0→i的路径和的最大值
等价于
最长路求dist[i]
小技巧
因为最短路的不等式关系都是 <= 故最终可以得到变量的最大值
最长路的不等式关系都是 >= 故最终可以得到变量的最小值