谈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 ] 满足所有约束条件的最小值..

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值