差分约束系统

本文转自: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

posted @ 2015-07-31 21:51  xcw0754  阅读(209)  评论(0编辑  收藏  举报