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

    本文转自:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html

      一直不知道差分约束是什么类型题目,最近在写最短路问题就顺带看了下,原来就是给出一些形如x-y<=b不等式的约束,问是否有解!

      神奇的是这类问题竟然可以转换成图论里的最短路径问题,下面开始详细介绍下:

      (1)比如给出三个不等式,b-a<=k1,c-b<=k2,c-a<=k3,若要求出c-a的最大值,我们可以把a,b,c转换成三个点,k1,k2,k3是边上的权,如图

      由题我们可以得知,这个有向图中,由题b-a<=k1,c-b<=k2,得出c-a<=k1+k2,因此比较k1+k2和k3的大小,求出最小的就是c-a的最大值了。

      根据以上的解法,我们可能会猜到求解过程实际就是求从a到c的最短路径,没错的....简单的说就是从a到c沿着某条路径后把所有权值和k求出就是c -a<=k的一个推广的不等式约束,既然这样,满足题目的肯定是最小的k,也就是从a到c最短距离...

      理解了这里之后,想做题还是比较有困难的,因为题目需要变形一下,不能单纯的算..

      (1)首先以poj3159为例,这个比较简单,就是给出两个点的最大差,然后让你求1到n的最大差,直接建图后用bellman或者spfa就可以过了。

      (2)稍微难点的就是poj1364,因为他给出的不等式不是x-y<=k形式,有时候是大于号,这样需要我们去变形一下,并且给出的还是>,<没有等于,都要变形

      (3)再有就是poj1201,他要求出的是最长距离,那就要把形式变换成x-y>=k的标准形式

    注意点:

    (1)需要充分挖掘出所有的约束条件,无论用的是什么符号,先全部列出来。再转成对应的标准差分不等式。

    (2)转换技巧:如果只出现了小/大于号,则直接转成带等于号的,例如 x-y<k  转成 x-y<=k-1,反方向同理。如果只出现了等于号,则写成两条式子a-b<=c 和 a-b>=c。

    (3)若求的是最大值,则标准形式为 a - b <= c ,然后建一条的权值为c 的边,注意跑的却是最短路。 

    (4)若求的是最小值,则标准形式为 a - b >= c ,然后建一条b 到a 的权值为c 的边,注意跑的却是最长路。

    (5)出现冲突的情况:最好用spfa来跑比较好,存在负环的话就是无解,因为肯定有冲突。

    (6)出现任意解的情况:求不出最短路(即dist[n]没有得到更新)就是任意解,因为并没有约束到最后一个位置上,则至少[n-1,n]可以无限。还有情况就是建完图后并不连通,类似于约束[2,8]和[3,7]会完全无交集,那么遍历不到所有边,有些约束就没有被考虑。有一些方法可以解决,比如跑最短路前先将所有点进队,或者考虑添加超级源点s,添加一些约束在相邻位置,比如[i,i+1]<=0等等,具体问题具体分析。

    (7)一种建图的技巧: 
      设x[i]是第i位置(或时刻)的值(跟所求值的属性一样),那么把x[i]看成数列,前n项和为s[n],则x[i] = s[i] - s[i-1]那么这样就可以最起码建立起类似这样的一个关系:0 <= s[i] - s[i-1] <= 1。比如每个位置可以放至多1个苹果,而限制条件是位置[2->5]至少有1个苹果,部分区间并未提及,但是仍需验证此差分约束系统是否有解,因为相邻的位置是有关系的,所以位置关系的条件就有用了。

    这个博客也不错http://972169909-qq-com.iteye.com/blog/1185527

  • 相关阅读:
    Sublime Text配置Python开发利器
    Python字符进度条
    安装和使用的django的debug_toolbar
    Python数组合并
    django创建项目
    Python的闭包
    Python获取对象的元数据
    Python的枚举类型
    Django的Model上都有些什么
    Git使用相关
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4693244.html
Copyright © 2011-2022 走看看