谈SPFA解差分约束最大值最小值的原理...

自我分析,为什么用SPFA解差分方程,用最短路径求差分方程的最大解;用最长路径求差分方程的最小解.

如果给出的是一组:

a2 - a1 <= k1

a3 - a1 <= k2

....

之类的一组小于等于的不等式组...那么看 a - b <= k .. 化成 a < = b + k ... 这时构边是 b 为起点,a 为终点,权值为k的边...

而此时SPFA是求最短路径的Relax是

if ( d [ line.end ] > d [ line.start ] + line.wight )

d [ line.end ] = d [ line.start ] + line.wight;

那么 d [ line.end ] 的值最终将是 d [ line.start ] + line.wight 里最小的...若先令了一个源点...则这个d [ line.end ]就是 line.end 这个点的值..而这个值满足所有的约束条件..并且等于了最小的 a + k 但不会比最小的还要小..也就是 line.end 满足的是所有 line.end <= a+k 中a+k最小的...虽然line.end再小些也会满足与其所有 <= 的 关系..但正因为SPFA更新时一直是 = 所以求出的就是 d [ line.end ] 满足所有约束条件的最大值..


如果给出的是一组:

a2 - a1 >= k1

a3 - a1 >= k2

....

之类的一组小于等于的不等式组...那么看 a - b >= k .. 化成 a > = b + k ... 这时构边是 b 为起点,a 为终点,权值为k的边...

而此时SPFA是求最长路径,Relax是

if ( d [ line.end ] < d [ line.start ] + line.wight )

d [ line.end ] = d [ line.start ] + line.wight;

那么 d [ line.end ] 的值最终将是 d [ line.start ] + line.wight 里最大的...若先令了一个源点...则这个d [ line.end ]就是 line.end 这个点的值..而这个值满足所有的约束条件..并且等于了最大的 a + k 但不会比最大的还要大..也就是 line.end 满足的是所有 line.end >= a+k 中 a+k最大的...虽然line.end再大些也会满足与其所有 >= 的关系..但正因为SPFA更新时一直是 = 所以求出的就是 d [ line.end ] 满足所有约束条件的最小值..

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值