问题
差分约束是这样一类线性约束:
⎩⎨⎧x1−x2≤0x1−x5≤−1x2−x5≤1−x1+x3≤5−x1+x4≤4−x3+x4≤−1−x3+x5≤−3−x4+x5≤−3 上面的不等式可以转化为线性不等式:
110−1−1000−1010000000010−1−100000110−10−1−100011⋅x1x2x3x4x5≤0−1154−1−3−3 进一步抽象为:
A⋅X≤B 矩阵A=n×m有n行m列,每一行有且仅有一个1和一个−1,其余所有值都是0。未解数矩阵X=1×m有1行m列,依次为[x1,x2,…,xm]。常熟矩阵B=n×1有n行1列,依次为[b1,b2,…,bn]。
第k行不等式满足:
xi⋅A(k,i)+xj⋅A(k,j)≤bk 其中1≤k≤n,A(k,i),A(k,j)等于1或−1,且i,j∈[1,m]。
这样的线性不等式组称为差分约束。
对于上面的差分约束,存在一组解:
X=[−5,−3,0,−1,−4] 对于任意常数x,都有解:
X=[−5+x,−3+x,0+x,−1+x,−4+x] 即该差分约束的通解。
给定矩阵A,X,B以及行数n列数m,求差分约束的解。
解法
差分约束是最短路径在线性规划上的典型应用之一。将差分约束转化为有向图DG=<V,E>。
将所有不等式xi⋅A(k,i)+xj⋅A(k,j)≤bk转化为有向图的边ei,j,权值为bk,共n条边m个顶点。再额外增加顶点v0,且顶点v0到其他m个顶点都存在边e0,i,权值为0,共m条边。最终有向图DG有m个顶点n+m条边。
通过Bellman Ford算法求出v0到其他所有顶点的最短路径dist(i)。若其中存在某个顶点的最短路径dist(i)<0,则说明该图不存在最短路径,对应的差分约束也不存在解;否则dist(i)即为差分约束的解xi。即差分约束的解为:
xi=dist(i)X=[dist(1),dist(2),…,dist(m)] 该算法的时间复杂度与Bellman Ford算法相同,也是O(∥V∥⋅∥E∥)。
Introduction To Algorithms
源码
DifferentConstraints.h
DifferentConstraints.cpp
测试
DifferentConstraintsTest.cpp