如果一个系统由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 <span style="font-family:Arial;BACKGROUND-COLOR: #ffffff"></span>
在实际的应用中,一般使用
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)的系数一定要是正的。而
常量
则不一定。