差分约束系统--详讲

来源:互联网 发布:淘宝怎么找冰毒 编辑:程序博客网 时间:2024/06/06 10:40

------------差分约束题目请戳:差分约束题集暨报告

总的开说差分约束问题就是给出一系列不等式然后求问某一式子的最大值或者最小值。

差分约束问题详解:

    比如有这样一组不等式: 
   
X1 - X2 <= 0 
X1 - X5 <= -1 
X2 - X5 <= 1 
X3 - X1 <= 5                   不等式组(1) 
X4 - X1 <= 4 
X4 - X3 <= -1 
X5 - X3 <= -3 
X5 - X4 <= -3 

    全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于)。这样的不等式组就称作差分约束系统。 
    这个不等式组要么无解,要么就有无数组解。因为如果有一组解{X1, X2, ..., Xn}的话,那么对于任何一个常数k,{X1 + k, X2 + k, ..., Xn + k}肯定也是一组解,因为任何两个数同时加一个数之后,它们的差是不变的,那么这个差分约束系统中的所有不等式都不会被破坏。 
    
    差分约束系统的解法利用到了单源最短路径问题中的三角形不等式。即对于任何一条边u -> v,都有: 

d(v) <= d(u) + w(u, v) 

    其中d(u)和d(v)是从源点分别到点u和点v的最短路径的权值,w(u, v)是边u -> v的权值。 
    显然以上不等式就是d(v) - d(u) <= w(u, v)。这个形式正好和差分约束系统中的不等式形式相同。于是我们就可以把一个差分约束系统转化成一张图,每个未知数Xi对应图中的一个顶点Vi,把所有不等式都化成图中的一条边。对于不等式Xi - Xj <= c,把它化成三角形不等式:Xi <= Xj + c,就可以化成边Vj -> Vi,权值为c。

在建立图的时候应该与目标函数的符号相同,即目标函数为>=,不等式的符号也应该变为>=,再根据不等式建立图;

相反,如果是<=,不等式也应该全部变为<=,再建立图;

(一致性)符号是>=或者<=,并非<和>


上文就讲了如何根据不等式建立图,哪到底和问题的不等式的最大值或者最小值有什么关联呢?

如题目要求d(v) - d(u)的最小值,可以转换成d(v) - d(u) >=M,而根据上文得知M为u->v的权值。

要想上式子成立,则应有min(d(v) - d(u))>=max(M),即转成了求u->v最长的路径即式子的最小值

相同,如果求d(v) - d(u)的最大值,这应该求u->v的最小路径

对于差分不等式,a - b <= c ,求的是最短路,得到的是最大值;

对于差分不等式, a - b >= c ,求的是最长路,得到的是最小值。


关于补不补充源点:

其实差分约束并不需要附加源点,附加源点的唯一作用是连接 整个图(保证图的连通),不让你有负环判不到的情况。(超级源点)

当然解决这个问题的最佳途径是初始把所有的顶点都加入队列,并将所有的dist置0。

这就相当于从每一个顶点开始遍历。也就不用附加源点了。


如果图中存在负权值回路,则求出来的最短路径没有意义。也就是说不等式无解。所以要从是否有负权值回路进而判断有无解。


------------差分约束题目请戳:差分约束题集暨报告

0 1