zoukankan      html  css  js  c++  java
  • 差分约束

    这两天看POJ1201:intervals,看到很多别人的博客,据说要用差分约束的知识,于是各种搜索了一下。

    差分约束主要用于解决形如xi-xj<dk这样的两两变量之间的小于不等式组。

    把每个变量xi看成一个点i,构造图,每遇到一个不等式xi-xj<=dk,则在图中添加i点与j点之间的边长为dk的边,然后在图上运用最短路径算法,最后其实是相当于得到的是变量两两之间的限制条件,但是因为有等号,所以可以随便假设一个xi=1,则可以根据最短路径数组,得到一组可行解。

    解释一下,为什么可以把这组不等式抽象为图,并应用最短路径算法:

    1.图中的每一条边代表的是xi-xj<=dij,那么最短路径对边的优化条件是:如果dij+djk<dik,则更新dik。如果用不等式来解释的话,意思就是有这么三个不等式xi-xj<=dij; xj-xk<=djk; xi-xk<=dik; 那么将第一个不等式与第二个不等式相加,得到的结果是,xi-xk<=dij+djk,又因为dij+djk<dik,那么其实就相当于不等式xi-xk<=dik是没用的,因为有更严格的限制条件xi-xk<=dij+djk存在,故更新点i和点k边为dij+djk。

    2.这样一步一步地优化两点间的距离,直到是最短距离时,就意味着,此时的dij已经能够满足先前所有的不等式了。又因等号是成立的,所以最后求可行解的时候,只需要随便假设一个xi值,再根据dij,将xj = xi - dij,则求出的所有变量均满足不等式。

    问题1:假设所有的不等式是xi-xj<dk呢?应当如何解决找到一组可行解?

    因为存在一种现象:假设x1-x2<2;   x2-x3<2. 那么根据最短路径算出的结果得到的不等式是x1-x2<2;   x2-x3<2;   x1-x3<4;这三个不等式而已,如果我设 x1 = 5,  因为等号不成立,所以必然我需要设x2 = x1 - 2 + Δ ; 才能使不等式满足,此时每一次赋值的时候这个Δ应该怎么取,才能够使上面的结论依然成立?在上述的例子中,假设只根据x1的单源最短路径的结果来赋值的话,那么我为了满足不等式,我可以设置x1=5,x2=5,x3=2,这样的结果是第二个不等式不能满足了。如何解决这样的问题?Δ应该如何设置才能解决问题?

    刚开始想到这个问题的时候,以为是什么不得了的问题,仔细想想,其实只要每一次赋值的Δ取一样的值,就不会改变给其他的变量赋值时的不等关系。  

    问题2:以及假设不等式x1-x2<=1与x2-x1<=2两个不等式同时存在,问题应该如何解决?

    想到这个问题的时候,才突然发觉,根据不等式的有向性,这个图建立的时候就应该是一个有向图。。。

    尽管现在想想,感觉自己想到的问题挺sb的,不过刚开始想到的时候感觉还是不错,加深了我对差分约束的理解。

  • 相关阅读:
    Java 线程安全与锁优化
    Linux内常用的BASH命令
    Java导出CSV用MS Office Excel打开乱码问题一招制胜办法
    素数个数求解与素数的判定
    Java 线程间的通信wait(), notify(), join(), ThreadLocal讲解
    Java volatile关键字特性介绍
    项目架构相关
    HTTP POST 请求 及 @RequestParam @RequestPart @RequestBody
    Web安全相关
    Thread和Runable比较
  • 原文地址:https://www.cnblogs.com/xiaoshen555/p/3826476.html
Copyright © 2011-2022 走看看