zoukankan      html  css  js  c++  java
  • 差分约束学习小计

    差分约束体系

    • 有若干个不等式xi<=xj+k(或经过移项可以表示成这个形式)
    • 求xt-xs的最大值或最小值。

    算法思想

    • 考虑对于任意不等式xi<=xj+k,我们将它与最短路中的边类比。
    • 在最短路中如果有一条边(u,v),当dis[u]+cost<dis[v]时我们要更新dis[v],使得dis[v]=dis[u]+cost(u,v)
    • 实际上最终的dis一定满足任意边(u,v),dis[v]<=dis[u]+cost,并且任意一个非起点的x有一条边使得dis[x]=dis[y]+cost(x,y)。
    • 有向图中的dis和不等式中的x实际上是一样的。如果对于不等式xi<=xj+k,由j向i连一条边权为k的边,那么最终的有向图的dis,在最短路算法后满足了dis[v]<=dis[u]+cost(也就是最紧的约束条件),就相当于所有的x满足了xi<=xj+k的约数条件。
    • 并且由于我们走的是最短路,实际上可以看作每一次都走不等式的上限k,所以最后的dis[i]即为x[i]-x[s](s是最短路起点)的最大值。
      在这里插入图片描述

    实现

    • 任意不等式xi<=xj+k,连一条j到i的边权为k的边。
    • 跑s的单源最短路,dis[i]即为x[i]-x[s](s是最短路起点)的最大值。

    最小值怎么算?

    1. 将边依旧按照上面连。求x[t]-x[s]的最小值,等价于求x[s]-x[t]的最大值,跑起点为t的单源最短路。再求个相反数。
    2. 任意不等式xi>=xj+k,连一条j到i的边权为k的边。然后跑起点为s的最长路(边权取反后跑最短路)。意义与求最大类似。
    • 以上两个做法的相对于求最大值得改变,本质分别是边方向取反和边权取反。
    • 两个做法的源点也是相反的,所以我们可以分别对所有i求x[i]-x[s]的最小值,或对所有i求x[t]-x[i]的最小值。

    无解、有解、无限解

    无限解

    • 负环说明最大值可以趋近无穷大,最小值可以趋近于无穷小,就相当于无解的情况。
      无限解
    • s和t之间没有路径,即s和t没有限制关系,自然是无限解。

    图片来源/参考博客:

    https://blog.csdn.net/whereisherofrom/article/details/78922648#commentBox

  • 相关阅读:
    临时更换swap优先级
    设计一个百万级的消息推送系统----转
    使用apache cxf实现webservice服务
    如何成为一位「不那么差」的程序员---转
    轻量级web框架cicada----(转)
    shiro学习笔记
    java编程调试技巧
    zookeeper学习总结
    Kafka入门
    kafka 的经典教程
  • 原文地址:https://www.cnblogs.com/DeepThinking/p/11700919.html
Copyright © 2011-2022 走看看