差分约束系统
- 一种特殊的n元一次不等式组, 它包含n个变量以及m个约束条件。
- 每个约束条件是由其中的变量做差构成的,形如xi - xj <= ck,其中ck为常数(可以是非负数,也可以是负数)
- 要解决的问题是求一组解x1 = a1, x2 = a2,…, xn = an, 使得所有的约束条件都得到满足,否则判断出无解。
• 𝑥1 − 𝑥0 ≤ 1
• 𝑥2 − 𝑥0 ≤ 2
• 𝑥3 − 𝑥0 ≤ 4
• 𝑥2 − 𝑥1 ≤ 3
• 𝑥3 − 𝑥2 ≤ 1
• 在这个例子中,根据第3条可以知道 𝑥3 − 𝑥0 ≤ 4
• 根据第1、4、5条可以知道 𝑥3 − 𝑥0 ≤ 5
• 而根据第2、5条可以知道 𝑥3 − 𝑥0 ≤ 3
• 那么此时如果规定 𝑥0 = 0 则 𝑥3 的最大值是3
结论:求解差分约束系统,都可以转化为图论中单源最短路问题
• 对于差分约束中的每一个不等式约束 𝑥𝑖 − 𝑥𝑗 ≤ 𝑐𝑘 都可以移项变形为
𝑥𝑖 ≤ 𝑐𝑘 + 𝑥𝑗
• 如果令 𝑐𝑘 = 𝑤( 𝑖,𝑗) , 𝑑𝑖𝑠[ 𝑖] = 𝑥𝑖,𝑑𝑖𝑠 [𝑗] = 𝑥𝑗,那么原式变为 𝑑𝑖𝑠[ 𝑖] ≤
𝑑𝑖𝑠 [𝑗 ]+ 𝑤 (𝑖,𝑗) ,
由差分约束,转为图
对于每一个不等式约束 xi - xj <= ck, 从节点j 到结点 i 连一条长度为ck的有向边
路径与不等式约束一一对应
如果xs为原点
求最短路的效果,就可以求得任意一个变量的最终表达式
xi - xs <= wMin 即 xi - xs <= dis[ i ]
求解差分约束问题变成了求解最短路的问题
如果最终令xs = 0,那么xi = dis[ i ] 便是差分约束问题的一组解
解的存在性
存在负环
xi 的结果不存在,SPFA来判断负环
终点不可达
变量xi无约束,dis[ i ] = inf
不等式组的转化
xi - x1 >= T,转化为 x1 - xi <= -T
xi - x1 < T ,在整数域上可以转化为xi - x1 <= T - 1
xi - x1 = T , 转化为xi - x1 <= T 且 x1 - xi >= T
xi / xj <= k 的转化 ,取对数