DifferentConstraints 差分约束

问题

差分约束是这样一类线性约束:

{x1x20x1x51x2x51x1+x35x1+x44x3+x41x3+x53x4+x53\begin{cases} x_1 - x_2 \leq 0 \\ x_1 - x_5 \leq -1 \\ x_2 - x_5 \leq 1 \\ -x_1 + x_3 \leq 5 \\ -x_1 + x_4 \leq 4 \\ -x_3 + x_4 \leq -1 \\ -x_3 + x_5 \leq -3 \\ -x_4 + x_5 \leq -3 \end{cases}

上面的不等式可以转化为线性不等式:

[1100010001010011010010010001100010100011][x1x2x3x4x5][01154133]\begin{bmatrix} 1 & -1 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & -1 \\ 0 & 1 & 0 & 0 & -1 \\ -1 & 0 & 1 & 0 & 0 \\ -1 & 0 & 0 & 1 & 0 \\ 0 & 0 & -1 & 1 & 0 \\ 0 & 0 & -1 & 0 & 1 \\ 0 & 0 & 0 & -1 & 1 \end{bmatrix} \cdot \begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \\ x_5 \end{bmatrix} \leq \begin{bmatrix} 0 \\ -1 \\ 1 \\ 5 \\ 4 \\ -1 \\ -3 \\ -3 \end{bmatrix}

进一步抽象为:

AXBA \cdot X \leq B

矩阵A=n×mA = n \times mnnmm列,每一行有且仅有一个11和一个1-1,其余所有值都是00。未解数矩阵X=1×mX = 1 \times m11mm列,依次为[x1,x2,,xm][x_1, x_2, \dots, x_m]。常熟矩阵B=n×1B = n \times 1nn11列,依次为[b1,b2,,bn][b_1, b_2, \dots, b_n]

kk行不等式满足:

xiA(k,i)+xjA(k,j)bkx_i \cdot A(k,i) + x_j \cdot A(k,j) \leq b_k

其中1kn1 \leq k \leq nA(k,i),A(k,j)A(k,i), A(k,j)等于111-1,且i,j[1,m]i,j \in [1,m]

这样的线性不等式组称为差分约束。

对于上面的差分约束,存在一组解:

X=[5,3,0,1,4]X = [-5, -3, 0, -1, -4]

对于任意常数xx,都有解:

X=[5+x,3+x,0+x,1+x,4+x]X = [-5+x, -3+x, 0+x, -1+x, -4+x]

即该差分约束的通解。

给定矩阵A,X,BA, X, B以及行数nn列数mm,求差分约束的解。

解法

差分约束是最短路径在线性规划上的典型应用之一。将差分约束转化为有向图DG=<V,E>DG = <V,E>

将所有不等式xiA(k,i)+xjA(k,j)bkx_i \cdot A(k,i) + x_j \cdot A(k,j) \leq b_k转化为有向图的边ei,je_{i,j},权值为bkb_k,共nn条边mm个顶点。再额外增加顶点v0v_0,且顶点v0v_0到其他mm个顶点都存在边e0,ie_{0,i},权值为00,共mm条边。最终有向图DGDGmm个顶点n+mn+m条边。

通过Bellman Ford算法求出v0v_0到其他所有顶点的最短路径dist(i)dist(i)。若其中存在某个顶点的最短路径dist(i)<0dist(i) \lt 0,则说明该图不存在最短路径,对应的差分约束也不存在解;否则dist(i)dist(i)即为差分约束的解xix_i。即差分约束的解为:

xi=dist(i)X=[dist(1),dist(2),,dist(m)]\begin{matrix} x_i = dist(i) \\ X = [dist(1), dist(2), \dots, dist(m)] \end{matrix}

该算法的时间复杂度与Bellman Ford算法相同,也是O(VE)O(\| V \| \cdot \| E \|)

Introduction To Algorithms

源码

DifferentConstraints.h

DifferentConstraints.cpp

测试

DifferentConstraintsTest.cpp

Last updated