差分约束系统

差分约束系统

差分约束系统是一种特殊的 N N N元一次不等式组。它包含 N N N个变量 X 1 X_1 X1​~ X N X_N XN​以及 M M M个约束条件,每个约束条件都是由两个变量做差构成的,形如 X i − X j ≤ c k X_i-X_j\leq c_k Xi​−Xj​≤ck​,其中 c k c_k ck​是常数(可以是非负数,也可以是负数), 1 ≤ i , j ≤ N , 1 ≤ k ≤ M 1\leq i,j\leq N,1\leq k\leq M 1≤i,j≤N,1≤k≤M。我们要解决的问题就是:求一组解 X 1 = a 1 , X 2 = a 2 , ⋯   , X N = a N X_1=a_1,X_2=a_2,\cdots,X_N=a_N X1​=a1​,X2​=a2​,⋯,XN​=aN​,即解 X = ( a 1 , a 2 , ⋯   , a N ) X=(a_1,a_2,\cdots,a_N) X=(a1​,a2​,⋯,aN​)使得所有约束条件都能得到满足。

差分约束系统的每个约束条件 X i − X j ≤ c k X_i-X_j\leq c_k Xi​−Xj​≤ck​可以变形为 X i ≤ X j + c k X_i\leq X_j+c_k Xi​≤Xj​+ck​,这与单源最短路径问题中的三角不等式 d i s t [ y ] ≤ d i s t [ x ] + z dist[y]\leq dist[x]+z dist[y]≤dist[x]+z非常相似,注意这个式子是更新过后的。因此,我们可以把每个变量 X i X_i Xi​看作是有向图中的一个节点 i i i,对于每个约束条件 X i − X j ≤ c k X_i-X_j\leq c_k Xi​−Xj​≤ck​,从节点 j j j向节点 i i i连一条长度为 c k c_k ck​的有向边。

引理:

设 X = ( x 1 , x 2 , ⋯   , x n ) X=(x_1,x_2,\cdots,x_n) X=(x1​,x2​,⋯,xn​)是一个差分约束系统的一个解, d d d为任意常数,那么 X + d = ( x 1 + d , x 2 + d , ⋯   , x n + d ) X+d=(x_1+d,x_2+d,\cdots,x_n+d) X+d=(x1​+d,x2​+d,⋯,xn​+d)也是该系统的解。

证明:对于每个 x i x_i xi​和 x j x_j xj​,有 ( x j + d ) − ( x i + d ) = x j − x i (x_j+d)-(x_i+d)=x_j-x_i (xj​+d)−(xi​+d)=xj​−xi​。因此,若 X X X是这个差分约束系统的一个解,那么 X + d X+d X+d也是这个系统的解

例如:

X = { x 1 − x 2 ≤ 0 x 1 − x 5 ≤ − 1 x 2 − x 5 ≤ 1 x 3 − x 1 ≤ 5 x 4 − x 1 ≤ 4 x 4 − x 3 ≤ − 1 x 5 − x 3 ≤ − 3 x 5 − x 4 ≤ − 3 X=\begin{cases} x_1-x_2\leq 0 \\ x_1-x_5\leq -1 \\ x_2-x_5\leq 1\\ x_3-x_1\leq 5\\ x_4-x_1\leq 4\\ x_4-x_3\leq -1\\ x_5-x_3\leq -3\\ x_5-x_4\leq -3\end{cases} X=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​x1​−x2​≤0x1​−x5​≤−1x2​−x5​≤1x3​−x1​≤5x4​−x1​≤4x4​−x3​≤−1x5​−x3​≤−3x5​−x4​≤−3​

该问题的一个解为 X = ( − 5 , − 3 , 0 , − 1 , − 4 ) X=(-5,-3,0,-1,-4) X=(−5,−3,0,−1,−4),令一个解为 X ′ = ( 0 , 2 , 5 , 4 , 1 ) X'=(0,2,5,4,1) X′=(0,2,5,4,1),这两个解是有联系的, X ′ X' X′中的每个元素比 X X X中的相应元素大5

这也正说明了,如果 X X X是一个差分约束系统的解,那么 X + d X+d X+d也是这个系统的解

假设 ∀ i , X i ≤ c \forall i,X_i\leq c ∀i,Xi​≤c,然后再增加一个超级源点0号节点,令 X 0 = 0 X_0=0 X0​=0,令 d = − X 0 d=-X_0 d=−X0​,等式两边同时加上 d d d,可得 X i − X 0 ≤ c − X 0 X_i-X_0\leq c-X_0 Xi​−X0​≤c−X0​,即 X i − X 0 ≤ c X_i-X_0\leq c Xi​−X0​≤c。这样一来,就多了 N N N个形如 X i − X 0 ≤ 0 X_i-X_0\leq 0 Xi​−X0​≤0的约束条件,应该从节点0向每个节点 i i i连一条长度为0的有向边。


约束图

对于 n n n个变量, m m m个约束条件来说,其实就是对应于图论中的 n n n个节点, m m m条边。对于 i = 1 , 2 , ⋯   , n i=1,2,\cdots,n i=1,2,⋯,n,图中的每一个顶点 v i v_i vi​对应着 n n n个未知量中的一个 x i x_i xi​,图中的每个有向边对应着关于两个未知量的 m m m个不等式的其中一个。

对于一个差分约束系统来说,相应的约束图是一个带权有向图 G = ( V , E ) G=(V,E) G=(V,E),其中 V = V= V={ v 0 , v 1 , ⋯   , v n v_0,v_1,\cdots,v_n v0​,v1​,⋯,vn​},而且 E = E= E={ ( v i , v j ) : x j − x i ≤ b k (v_i,v_j):x_j-x_i\leq b_k (vi​,vj​):xj​−xi​≤bk​} ⋃ \bigcup ⋃ { ( v 0 , v 1 ) , ( v 0 , v 2 ) , ⋯   , ( v 0 , v n ) (v_0,v_1),(v_0,v_2),\cdots,(v_0,v_n) (v0​,v1​),(v0​,v2​),⋯,(v0​,vn​)}

这里引入超级源点 v 0 v_0 v0​是为了保证其他每个顶点 v 1 , v 2 , ⋯   , v n v_1,v_2,\cdots,v_n v1​,v2​,⋯,vn​均从 v 0 v_0 v0​可达。因此,顶点集合 V V V由对应于每个未知量 x i x_i xi​的顶点 v i v_i vi​和附加的顶点 v 0 v_0 v0​所组成。边的集合 E E E由对应于每个差分约束条件的边与对应于每个未知量 x i x_i xi​的边 ( v 0 , v i ) (v_0,v_i) (v0​,vi​)所构成。如果 x j − x i ≤ b k x_j-x_i\leq b_k xj​−xi​≤bk​是一个差分约束,则边 ( v i , v j ) (v_i,v_j) (vi​,vj​)的权 w ( v i , v j ) = b k w(v_i,v_j)=b_k w(vi​,vj​)=bk​。从超级源点 v 0 v_0 v0​出发的每条边的权值均为0。

约束图如下:

差分约束系统


定理

给定一个差分约束系统,设 G = ( V , E ) G=(V,E) G=(V,E)为其相应的约束图。如果 G G G不包含负权回路(即负环),那么

X = ( δ ( v 0 , v 1 ) , δ ( v 0 , v 2 ) , δ ( v 0 , v 3 ) , ⋯   , δ ( v 0 , v n ) ) X=(\delta (v_0,v_1),\delta (v_0,v_2),\delta (v_0,v_3),\cdots,\delta (v_0,v_n)) X=(δ(v0​,v1​),δ(v0​,v2​),δ(v0​,v3​),⋯,δ(v0​,vn​))

是此系统的一个可行解。当且仅当 G G G中存在负环时,该系统不存在可行解。

上式中 δ ( v 0 , v 1 ) \delta(v_0,v_1) δ(v0​,v1​)表示超级源点 v 0 v_0 v0​到节点 v 1 v_1 v1​的真实的最短距离,其他同理。跑一边最短路算法后得到的 d i s t [ v 1 ] dist[v_1] dist[v1​]其实就是 δ ( v 0 , v 1 ) \delta(v_0,v_1) δ(v0​,v1​)

证明:

  • 首先来证明,如果 G G G中不存在负环时,那么可以求出一个可行解。考察任意边 ( v i , v j ) ∈ E (v_i,v_j)\in E (vi​,vj​)∈E,由三角不等式 δ ( v 0 , v j ) ≤ δ ( v 0 , v i ) + w ( v i , v j ) \delta (v_0,v_j)\leq \delta (v_0,v_i)+w(v_i,v_j) δ(v0​,vj​)≤δ(v0​,vi​)+w(vi​,vj​),即 δ ( v 0 , v j ) − δ ( v 0 , v i ) ≤ w ( v i , v j ) \delta (v_0,v_j)-\delta (v_0,v_i)\leq w(v_i,v_j) δ(v0​,vj​)−δ(v0​,vi​)≤w(vi​,vj​)。因此,设 x i = δ ( v 0 , v i ) , x j = δ ( v 0 , v j ) x_i=\delta (v_0,v_i),x_j=\delta(v_0,v_j) xi​=δ(v0​,vi​),xj​=δ(v0​,vj​),带入上式子可知满足对应边 ( v i , v j ) (v_i,v_j) (vi​,vj​)的差分约束 x j − x i ≤ w ( v i , v j ) x_j-x_i\leq w(v_i,v_j) xj​−xi​≤w(vi​,vj​)

  • 接下来再来证明,如果 G G G中存在负环,那么差分约束系统不存在可行解。设负权回路为 c = < v 1 , v 2 , ⋯   , v k > c=<v_1,v_2,\cdots,v_k> c=<v1​,v2​,⋯,vk​>,其中 v 1 = v k v_1=v_k v1​=vk​(因为节点 v 0 v_0 v0​没有入边,所以它不可能再回路 c c c上)。回路 c c c对应着如下的差分约束:

    { x 2 − x 1 ≤ w ( v 1 , v 2 ) x 3 − x 2 ≤ w ( v 2 , v 3 ) ⋯ x k − x k − 1 ≤ w ( v k − 1 , v k ) x 1 − x k ≤ w ( v k , v 1 ) \begin{cases}x_2-x_1\leq w(v_1,v_2)\\ x_3-x_2\leq w(v_2,v_3)\\ \cdots \\ x_k-x_{k-1}\leq w(v_{k-1},v_k)\\ x_1-x_k\leq w(v_k,v_1) \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​x2​−x1​≤w(v1​,v2​)x3​−x2​≤w(v2​,v3​)⋯xk​−xk−1​≤w(vk−1​,vk​)x1​−xk​≤w(vk​,v1​)​

    假设存在满足 k k k个不等式的一个解 X X X,那么也满足上述 k k k个不等式相加所得到的不等式。如果把这些不等式相加,就会发现每个变量 x i x_i xi​的正负项相互抵消了,结果左边项和为0,而右边项和为 w ( c ) w(c) w(c),因此有 0 ≤ w ( c ) 0\leq w(c) 0≤w(c)。但是由于 c c c是一个负权回路,因此有 w ( c ) < 0 w(c)<0 w(c)<0,因此得到矛盾 0 ≤ w ( c ) < 0 0\leq w(c)<0 0≤w(c)<0,由此得证


求不等式组的可行解:

源点需要满足的条件:从源点出发,一定可以走到所有边

步骤:

  • 先将每个不等式 x i ≤ x j + c k x_i\leq x_j+c_k xi​≤xj​+ck​,转化为一条从 x j x_j xj​走到 x i x_i xi​,长度为 c k c_k ck​的一条边
  • 找到一个超级源点,使得该源点一定可以遍历到所有边
  • 从源点求一边单源最短路
    • 如果存在负环,则原不等式组一定无解
    • 如果不存在负环,则 X = ( d i s t [ v 1 ] , d i s t [ v 2 ] , ⋯   , d i s t [ v n ] ) X=(dist[v_1],dist[v_2],\cdots,dist[v_n]) X=(dist[v1​],dist[v2​],⋯,dist[vn​])的一个可行解

在某些题目中,约束条件形如 X i − X j ≥ c k X_i-X_j\geq c_k Xi​−Xj​≥ck​,我们仍然可以从 j j j到 i i i连一条长度为 c k c_k ck​的有向边,只不过现在应该要计算单源最长路,若图中存在正环则无解。当然,我们也可以把约束条件转换为 X j − X i ≤ − c k X_j-X_i\leq -c_k Xj​−Xi​≤−ck​,再按照单源最短路进行计算


最大值和最小值

对于给定的一组不等式关系,如何求出每个变量的最大值或者最小值呢?

什么是最大值或最小值?

这里的意思是说,比如你求出了一个解 X = ( x 1 , x 2 , ⋯   , x n ) X=(x_1,x_2,\cdots,x_n) X=(x1​,x2​,⋯,xn​),那么 X ′ = ( x 1 + d , x 2 + d , ⋯   , x n + d ) X'=(x_1+d,x_2+d,\cdots,x_n+d) X′=(x1​+d,x2​+d,⋯,xn​+d)也是一个解, X ′ ′ = ( x 1 + 2 d , x 2 + 2 d , ⋯   , x 3 + 3 d ) X''=(x_1+2d,x_2+2d,\cdots,x_3+3d) X′′=(x1​+2d,x2​+2d,⋯,x3​+3d)也是一个解,那么我想知道某个变量 x i x_i xi​的最大值,那么到底是取 x i x_i xi​还是 x i + d x_i+d xi​+d还是 x i + 2 d x_i+2d xi​+2d呢?同理,求某个变量 x i x_i xi​的最小值也是一样的含义。

结论:

  • 如果求的是最小值,那么应该求单源最长路
  • 如果求的是最大值,那么应该求单源最短路

证明:

以求 x i x_i xi​的最大值为例:

求所有从 x i x_i xi​出发,构成的多个形如如下的不等式链:

x i ≤ x j + c m ≤ x k + c m + c n ≤ ⋯ ≤ x 0 + c 0 + c 4 + ⋯ + c n + c m x_i\leq x_j+c_m\leq x_k+c_m+c_n\leq \cdots \leq x_0+c_0+c_4+\cdots +c_n+c_m xi​≤xj​+cm​≤xk​+cm​+cn​≤⋯≤x0​+c0​+c4​+⋯+cn​+cm​,其中 x 0 = 0 , c 0 = 0 x_0=0,c_0=0 x0​=0,c0​=0,令 F = F= F= x 0 + c 0 + c 4 + ⋯ + c n + c m x_0+c_0+c_4+\cdots +c_n+c_m x0​+c0​+c4​+⋯+cn​+cm​

那么 x i x_i xi​的最大值,要注意 F F F可能多很多个,因此,我们取 F F F中最小的那个值,就是 x i x_i xi​的最大值

例如 x i ≤ 5 , x i ≤ 7 , x i ≤ 9 x_i\leq 5,x_i\leq 7,x_i\leq 9 xi​≤5,xi​≤7,xi​≤9,那么 x i x_i xi​的最大值为5。假设 x i x_i xi​取最大值为9,那么就不满足 x i ≤ 5 x_i\leq 5 xi​≤5和 x i ≤ 7 x_i\leq 7 xi​≤7了。

把上述转换成图论的问题,其实就是求 d i s t [ i ] dist[i] dist[i]的最小值(因为 F F F表示的是从起点出发,到达某个点的距离。那么求 F F F的最小值,其实就是求单源最短路),那么就可以用最短路来求解。

以求 x i x_i xi​的最小值为例:

求所有从 x i x_i xi​出发,构成的多个形如如下的不等式链:

x i ≥ x j + c m ≥ x k + c m + c n ≥ ⋯ ≥ x 0 + c 0 + c 4 + ⋯ + c n + c m x_i\geq x_j+c_m\geq x_k+c_m+c_n\geq \cdots \geq x_0+c_0+c_4+\cdots +c_n+c_m xi​≥xj​+cm​≥xk​+cm​+cn​≥⋯≥x0​+c0​+c4​+⋯+cn​+cm​,其中 x 0 = 0 , c 0 = 0 x_0=0,c_0=0 x0​=0,c0​=0,令 F = F= F= x 0 + c 0 + c 4 + ⋯ + c n + c m x_0+c_0+c_4+\cdots +c_n+c_m x0​+c0​+c4​+⋯+cn​+cm​

那么 x i x_i xi​的最小值,要注意 F F F可能多很多个,因此,我们取 F F F中最大的那个值,就是 x i x_i xi​的最小值

例如 x i ≥ 5 , x i ≥ 7 , x i ≥ 9 x_i\geq 5,x_i\geq 7,x_i\geq 9 xi​≥5,xi​≥7,xi​≥9,那么 x i x_i xi​的最大值为9。假设 x i x_i xi​取最小值为5,那么就不满足 x i ≥ 7 x_i\geq 7 xi​≥7和 x i ≥ 9 x_i\geq 9 xi​≥9了。

下面举个图例:

X = { x 2 − x 1 ≤ c 1 x 3 − x 2 ≤ c 2 x 3 − x 1 ≤ c 3 X=\begin{cases}x_2-x_1\leq c_1\\ x_3-x_2\leq c_2\\ x_3-x_1\leq c_3 \end{cases} X=⎩⎪⎨⎪⎧​x2​−x1​≤c1​x3​−x2​≤c2​x3​−x1​≤c3​​

那么,我们可以求出这样的:

{ x 3 ≤ x 1 + c 3 x 3 ≤ x 1 + c 1 + c 2 \begin{cases}x_3\leq x_1+c_3\\ x_3\leq x_1+c_1+c_2 \end{cases} {x3​≤x1​+c3​x3​≤x1​+c1​+c2​​

可以看出,约束变量 x 3 x_3 x3​的有两个条件,如果画到图中,就对应于有2条路径。那么当我们要求 x 3 x_3 x3​的最大值时,取的肯定是 x 1 + c 3 x_1+c_3 x1​+c3​和 x 1 + c 1 + c 2 x_1+c_1+c_2 x1​+c1​+c2​中的最小值,这样才能保证满足这两个约束条件,进而满足题目给定的所有原始的约束条件。

我们添加超级源点 s s s即 v 0 v_0 v0​,那么有 x 1 − x 0 ≤ c 0 x_1-x_0\leq c_0 x1​−x0​≤c0​,因此有如下:

{ x 3 ≤ x 0 + c 0 + c 3 x 3 ≤ x 0 + c 0 + c 1 + c 2 \begin{cases}x_3\leq x_0+c_0+c_3\\ x_3\leq x_0+c_0+c_1+c_2 \end{cases} {x3​≤x0​+c0​+c3​x3​≤x0​+c0​+c1​+c2​​

其中 x 0 = 0 , c 0 = 0 x_0=0,c_0=0 x0​=0,c0​=0

解释一样 x 0 + c 0 + c 3 x_0+c_0+c_3 x0​+c0​+c3​的含义:它表示从源点 v 0 v_0 v0​到达节点 v 3 v_3 v3​所走过的路径上的权值之和。 x 0 + c 0 + c 1 + c 2 x_0+c_0+c_1+c_2 x0​+c0​+c1​+c2​也是一样的含义。

画图如下:

差分约束系统

对应有两条路径:

  • v 0    ⟹    v 1    ⟹    v 3 v_0\implies v_1\implies v_3 v0​⟹v1​⟹v3​,从源点 v 0 v_0 v0​走到节点 v 3 v_3 v3​,所走过的路径之和为 c 0 + c 3 c_0+c_3 c0​+c3​
  • v 0    ⟹    v 1    ⟹    v 2    ⟹    v 3 v_0\implies v_1\implies v_2\implies v_3 v0​⟹v1​⟹v2​⟹v3​,从源点 v 0 v_0 v0​走到节点 v 3 v_3 v3​,所走过的路径之和为 c 0 + c 1 + c 2 c_0+c_1+c_2 c0​+c1​+c2​
  • 可以发现,既然我们知道了等式右边的式子含义,其实就是求从源点出发到达某个节点的距离,由于可能存在多条路径,因此有多个值,那么我们只需要根据单源最短路径算法,就可以求出最小的那个值了,设为 F m i n F_{min} Fmin​。因此,如果想要求某个变量 x i x_i xi​的最大值,那么就要满足 M a x ( x i ) ≤ F m i n Max(x_i)\leq F_{min} Max(xi​)≤Fmin​。这也就是说,求变量 x i x_i xi​的最大值,等价于跑一下单源最短路,求出最短路径的权值之和

因此,相应的就可以知道,要求 x i x_i xi​的最小值,其实就是跑一下单源最长路,求出最长路径的权值之和。


总结

  • x i ≥ x j + c x_i\geq x_j+c xi​≥xj​+c,则从节点 j j j向节点 i i i连一条长度为 c c c的边,要求变量 x i x_i xi​的最小值,则跑一下最长路即可
  • x i ≤ x j + c x_i\leq x_j+c xi​≤xj​+c,则从节点 j j j向节点 i i i连一条长度为 c c c的边,要求变量 x i x_i xi​的最大值,则跑一下最短路即可

总结

  • x i ≥ x j + c x_i\geq x_j+c xi​≥xj​+c,则从节点 j j j向节点 i i i连一条长度为 c c c的边,要求变量 x i x_i xi​的最小值,则跑一下最长路即可
  • x i ≤ x j + c x_i\leq x_j+c xi​≤xj​+c,则从节点 j j j向节点 i i i连一条长度为 c c c的边,要求变量 x i x_i xi​的最大值,则跑一下最短路即可

上一篇:中望3D2022 扩大面


下一篇:V0 第11节 验证环境组件