图论 ------差分约束

差分约束的应用

目录

差分约束的应用

1,求不等式组的可行解

原理

做法

2,如何求最大值或者最小值,这里的最值指的是每个变量的最值

结论

原理做法

结论

小技巧


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]

小技巧

因为最短路的不等式关系都是 <= 故最终可以得到变量的最大值

      最长路的不等式关系都是 >= 故最终可以得到变量的最小值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值