差分约束简述

来源:互联网 发布:ssd优化工具 编辑:程序博客网 时间:2024/06/05 17:58

差分约束也是一个各种算法的综合,
它用于解一系列的不等式(表示成a-b<=(>=)c的形式,即差分)
例如:
已知一连串约束
(1)x1 - x0 <= 2
(2)x2 - x0 <= 7
(3)x3 - x0 <= 8
(4)x2 - x1 <= 3
(5)x3 - x2 <= 2
然后求x3-x0的最大值
通过整理,我们可以整理出:
1.(3) x3 - x0 <= 8
2.(2)+(5) x3 - x0 <= 9
3.(1)+(4)+(5) x3 - x0 <= 7
因为要满足以上三个不等式,
所以x3-x0最大只能取min{7,8,9}=7

易知,所有不等式都是
x[i]-x[j] <= a[k] 的形式,
也就是x[i] <= x[j] + a[k]
看起来特别熟悉,像是SPFA(最短路径算法)中的松弛操作,
于是用dis来代替x,用w[i,j]替换a[k]
那么就变成dis[i] <= dis[j]+w[i,j],
而松弛操作则是若dis[i]>dis[j]+w[i,j],更新最短路,
而dis[i] <= dis[j]+w[i,j],即表示没必要进行松弛操作,也就是已经松弛完毕。
所以对于每个不等式x[i]-x[j] <= a[k],即可以视成点j向点i连一条有向边,权值为a[k]
求x[i]-x[j]的最大值则可以换成多条i~j的路径的最小值,即最短路径。

所有差分约束便可以转化成最短路径问题,

利用SPFA算法来解决最短路径问题,时间复杂度仅为O(kn)(k约为2)

但众所周知,不可能一定有解,还有更多的情况,如果要求的i和j
不连通,即代表i和j之间没有约束,那么可以取到无限大值。

如果存在负环,则说明最短路无限小,即不存在最短路。
也就是最大值不存在。

同样的,
x[i]-x[j]>=a[k]的形式也可以用最长路模型来求,
原因就让读者们来思考一下吧~
但前提是:
无论你想求最小值还是最大值,符号都要化成一样的。

最后,如果这些变量都是整数域上的,那么”>”,”<”,这些原本不能用差分约束解决的,便可以解决例如:
A-B < C ,则A-B <= C-1
模型就综上所述了

不过oi中的题目就并没有那么赤裸裸了,都会有一些掩盖,你必须找到当中的约束
1.线性约束,最简单的约束
例题:POJ 3169
提示:设第x个人的位置为d[x],那么。。(不透露)
别忘了相邻两点的约束关系

2.区间约束,关于区间的约束
例题:POJ 1201
提示:看起来貌似很复杂,但可以利用以前学过的前缀和方式来表示约束

3.未知条件的约束
例题:POJ 1275
提示:某些约束不等号右边的数不可知,那么就要通过二分答案的思想来寻找答案

0 0
原创粉丝点击