zoukankan      html  css  js  c++  java
  • 差分约束基本原理

    最短路的基本性质
    如果图中不存在负权回路,则当算法结束以后,对于边((x,y,w))(dist[y] <= dist[x] + w)成立。
    差分约束系统
    对于一组不等式

    [left{ egin{array}{c} x_1-x_2 leq0 \ x_1 - x_5 leq1 \ x_2 -x_5leq1 \ x_3 - x_1leq 4 \ x_4 - x_3leq -1 \ x_5 - x_3leq -3 \ x_5 -x_4leq -3 end{array} ight. ]

    特点是全部是两个未知数的差小于等于某一个常数,这样的不等式组就称为差分约束系统。

    这个不等式要么无解,要么就存在无限组解。因为如果存在一组解({x_1,x_2,...,x_n})的话,那么对于任何一个常数(k)(lbrace x_1+k,x_2+k,...,x_n+k brace)也肯定是一组解,因为任何两个数加上一个数后,他们之间的关系是不变的,差分约束系统所有的不等任然是满足的
    差分约束系统与最短路径
    差分约束系统的解法用到了单元最短路径问题中的三角不等式。对于有向图中任意一条边((u,v))都有:(dist[v] <= dist[u] + len[u]][v])

    如果存在顶点(u)到顶点(v)的有向边,那么从源点到顶点(v)的最短路径小于等于从源点到顶点(u)的最短路径长度加上边(u,v)的长度

    上述不等式和差分约束系统中的不等式相同,因此就可以把差分约束系统转化成一张图求解
    构图
    对于未知数(x_i)对应图中的一个顶点(v_i),把所有不等式都转化为图中的一条边,对于不等式(x_i - x_j leq y)转化为三角不等式(x_ileq x_j + y),就可以化成边((x_i,x_j,y)),最后在这条边上求一遍单源最短路径,这些不等式就全部满足了,因此它是单元最短路的基本性质

    求解
    若存在负环正环,则不等式组一定矛盾,以不同的顶点出发会得到不同的解,但这些解都一定合理
    增加源点
    源点需要满足的条件:从源点出发,一定可以走到所有的边。从0号点可以走到任意的边,则一定可以到达所有边,具体在实现算法的时候,可以附加上超级源点,这个顶点和每一个顶点都连接一条权值为0的边。
    算法求解的步骤

    1. 先将每一个不等式(x_ileq x_j + c_k)转化为一条从(x_j)走到(x_i)长度为(c_k)的一条边
    2. 找一个超级源点,使得该源点一定可以遍历到所有的边
    3. 从源点求一遍单源最段路径

    如果存在负环,则原不等式一定无解,否则,dist[i]就是原不等式组的一个可行解
    最大值和最小值的求法
    如果求得是最小值,则应该求最长路,如果求最大值,应该求最短路。
    对于(x_ileq c)不等式的转化,建立一个超级源点0,然后建立从0到(i)的边,长度是(c)即可
    最长路对应大于关系,最短路对应小于关系

  • 相关阅读:
    是否可以继承String类
    访问控制符 public,protected,private,以及默认(default)的区别
    构造器 Constructor 是否可被 override
    重载和重写的区别
    Java 的四个基本特性(抽象、封装、继承, 多态)
    面向对象和面向过程的区别
    Layui时间选择器只选择时和分,不显示秒
    解决JavaScript:Uncaught TypeError: xx(函数名)is not a function at HTMLInputElement.onclick
    Linux(Ubuntu):搭建GitLab托管代码
    【转】【Oracle 集群】Linux下Oracle RAC集群搭建之基本测试与使用(九)
  • 原文地址:https://www.cnblogs.com/zykBlog/p/13855838.html
Copyright © 2011-2022 走看看