算法总结---差分约束系统

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Contents

一、定义

二、详解

三、例题

一、定义(百度百科):

如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。

求解差分约束系统,可以转化成图论的单源最短路径(或最长路径)问题。

观察xj-xi<=bk,会发现它类似最短路中的三角不等式d[v]<=d[u]+w[u,v],即d[v]-d[u]<=w[u,v]。因此,以每个变量xi为结点,对于约束条件xj-xi<=bk,连接一条边(i,j),边权为bk。我们再增加一个源点s,s与所有定点相连,边权均为0。对这个图,以s为源点运行Bellman-ford算法(或SPFA算法),最终{d[ i]}即为一组可行解。

例如,考虑这样一个问题,寻找一个5维向量x=(xi)以满足:

这一问题等价于找出未知量xi,i=1,2,…,5,满足下列8个差分约束条件:

x1-x2≤0

x1-x5≤-1

x2-x5≤1

x3-x1≤5

x4-x1≤4

x4-x3≤-1

x5-x3≤-3

x5-x4≤-3

该问题的一个解为x=(-5,-3,0,-1,-4),另一个解y=(0,2,5,4,1),这2个解是有联系的:y中的每个元素比x 中相应的元素大5。

引理:设x=(x1,x2,…,xn)是差分约束系统Ax≤b的一个解,d为任意常数。则x+d=(x1+d,x2+d,…,xn+d)也是该系统Ax≤b的一个解。

bellman-ford算法伪代码:

for each v V do d[v] <-- 无限大; d[s] <-- 0

Relaxation

for i =1,...,|V|-1 do

for each edge (u,v) 属于E do

d[v] <-- min{d[v], d[u]+w(u,v)}

Negative cycle checking

for each v 属于V do if d[v]> d[u] + w(u,v) then no solution

在实际的应用中,一般使用SPFA(Shortest Path Fast Algorithm)算法来实现。

差分约束系统中源点到每个点的距离确定

关于Dist[]的初始化化

1.如果将源点到各点的距离初始化为0,最终求出的最短路满足它们之间相互最接近了

2.如果将源点到各点的距离初始化为INF(无穷大),其中之1为0,最终求出的最短路满足它们与该点之间相互差值最大。

3.差分约束系统的确立要根据自己确定的约束条件,从约束点走向被约束点

连边一般有两种方法,第一种是连边后求最长路的方法,第二种是连边后求最短路的方法。

例:d[x]-d[y]>=Z

如果想连边后求最长路那么将不等式变形为这种形式d[x]>=d[y]+z y---x连一条权值为z的边

求最短路则变形成d[y]<=d[x]-z x---y连一条权值为-z的边。

如果是别的不等式,也可以根据情况变形。但是要保证的是两个变量(x,y)的系数一定要是正的。而常量则不一定。

定理:将如上差分约束系统

转换成图后,以

为源点得到的最短路径序列为

(如果有解),则

满足

且若

任意解,则有

证明:首先由

,则显然有

满足

,这是因为每条边对应一个不等式且由图的构造法可知。其次考察

的最短路径

,我们有

直接相连且由路径最短知

,其中

为不等式

的常量即为边

的权,所以有

。对k做归纳,由

,又

,所以

所以后者成立。证毕

例:设有n个盒子标号为1...n,每个盒子最多放1个球。放法满足

(0

表示区间

最多可放

个球,求这n个盒子最多可放多少个球。[1]

令前k个盒子放的数目为

,则有

(1 ≤i ≤n ),

(1 ≤i ≤m)。以此约束条件用如上算法给出最短路径序列

,由定理知

是合法的放法,且

为最大值。

二、详解

引自某网友:

(本文假设读者已经有以下知识:最短路径的基本性质、Bellman-Ford算法。)

比如有这样一组不等式:

X1 - X2 <= 0

X1 - X5 <= -1

X2 - X5 <= 1

X3 - X1 <= 5

X4 - X1 <= 4

X4 - X3 <= -1

X5 - X3 <= -3

X5 - X4 <= -3

不等式组(1)

全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于)。这样的不等式组就称作差分约束系统。

这个不等式组要么无解,要么就有无数组解。因为如果有一组解{X1, X2, ..., Xn}的话,那么对于任何一个常数k,{X1 + k, X2 + k, ..., Xn + k}肯定也是一组解,因为任何两个数同时加一个数之后,它们的差是不变的,那么这个差分约束系统中的所有不等式都不会被破坏。

差分约束系统的解法利用到了单源最短路径问题中的三角形不等式。即对于任何一条边u -> v,都有:

d(v) <= d(u) + w(u, v)

其中d(u)和d(v)是从源点分别到点u和点v的最短路径的权值,w(u, v)是边u -> v的权值。

显然以上不等式就是d(v) - d(u) <= w(u, v)。这个形式正好和差分约束系统中的不等式形式相同。于是我们就可以把一个差分约束系统转化成一张图,每个未知数Xi对应图中的一个顶点Vi,把所有不等式都化成图中的一条边。对于不等式Xi - Xj <= c,把它化成三角形不等式:Xi <= Xj + c,就可以化成边Vj -> Vi,权值为c。最后,我们在这张图上求一次单源最短路径,这些三角形不等式就会全部都满足了,因为它是最短路径问题的基本性质嘛。

话说回来,所谓单源最短路径,当然要有一个源点,然后再求这个源点到其他所有点的最短路径。那么源点在哪呢?我们不妨自已造一个。以上面的不等式组为例,我们就再新加一个未知数X0。然后对原来的每个未知数都对X0随便加一个不等式(这个不等式当然也要和其它不等式形式相同,即两个未知数的差小于等于某个常数)。我们索性就全都写成Xn - X0 <= 0,于是这个差分约束系统中就多出了下列不等式:

X1 - X0 <= 0

X2 - X0 <= 0

X3 - X0 <= 0

X4 - X0 <= 0

X5 - X0 <= 0

不等式组(2)

对于这5个不等式,也在图中建出相应的边。最后形成的图如下:

相关文档
最新文档