差分约束

小学期学的算法和做OJ题的各种经验总结

  • 差分约束系统的解法利用到了单源最短路径问题中的三角形不等式。即对于任何一条边u -> v,都有:

    • dv ≤ du + wu->v
    • 其中du和dv是从源点分别到点u和点v的最短路径的权值,wu->v是边u -> v的权值。
    • 这个不等式可以化成 dv - du ≤ wu->v
  • 比如给出三个不等式

{ b − a ≤ k 1 c − b ≤ k 2 c − a ≤ k 3 \left\{ \begin{array}{c} b-a ≤ k_1\\ c-b ≤ k_2\\ c-a ≤ k_3 \end{array} \right. bak1cbk2cak3
求出c-a的最大值

由题得出
{ c − a ≤ k 1 + k 2 c − a ≤ k 3 → c − a ≤ m i n ( k 1 + k 2 , k 3 ) \left\{ \begin{array}{l} c-a ≤ k_1+k_2\\ c-a ≤ k_3 \end{array} \to c-a≤min(k_1+k_2,k_3) \right. {cak1+k2cak3camin(k1+k2,k3)

因此比较 k1+k2 和 k3 的大小,求出最小的就是c-a的最大值了。

我们可以把a,b,c转换成三个点,k1,k2,k3是边上的权,如图
差分约束
根据c-a ≤ min(k1+k2, k3),我们可以看到求 a到c的最大值min(k1+k2, k3) 就是求从a到c的最短路径。

(也就是说,每条边的权重是两点的最大距离,从a到c沿着某条路径后把所有权值和k求出就是c - a ≤ k的一个,a到c的最短路径的距离就是满足所有不等式的条件下a到c的最大距离)

※注意点:

  1. 如果要求最大值想办法把每个不等式变为标准v-u<=k的形式,然后建立一条从v到u权值为k的边,变得时候注意v-u<k => v-u<=k-1

    相反,如果求a到c的最小距离,只要把不等式全部变成 dv - du ≥ wu->v再求两点的最短路径

    如果要求最小值的话,变为v-u>=k的标准形式,然后建立一条从u到v的k边,求出最短路径即可

  2. 如果权值为正,用dj,spfa,bellman都可以,如果为负不能用dj,并且需要判断是否有负环,有的话就不存在

参考:https://www.cnblogs.com/zhangmingcheng/p/3929394.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值