差分約束系統 (System of Difference Constraints),是求解關於一組變數的特殊不等式組 之方法。
如果一個系統由
n
{\displaystyle n}
個變量和
m
{\displaystyle m}
個約束條件組成,其中若每個約束條件形如
x
j
−
x
i
≤
b
k
(
i
,
j
∈
[
1
,
n
]
,
k
∈
[
1
,
m
]
)
{\displaystyle x_{j}-x_{i}\leq b_{k}(i,j\in [1,n],k\in [1,m])}
,則稱其為差分約束系統。亦即,差分約束系統是求解關於一組變量的特殊不等式組的方法。
解法
求解差分約束系統,可以轉化成求解圖論 的單源最短路徑 。觀察
x
j
−
x
i
≤
b
k
{\displaystyle x_{j}-x_{i}\leq b_{k}}
,會發現它類似最短路中的三角不等式
d
[
v
]
≤
d
[
u
]
+
w
[
u
,
v
]
{\displaystyle d[v]\leq d[u]+w[u,v]}
,即
d
[
v
]
−
d
[
u
]
≤
w
[
u
,
v
]
{\displaystyle d[v]-d[u]\leq w[u,v]}
。因此,以每個變數
x
i
{\displaystyle x_{i}}
為結點,對於約束條件
x
j
−
x
i
≤
b
k
{\displaystyle x_{j}-x_{i}\leq b_{k}}
,連接一條邊
(
i
,
j
)
{\displaystyle (i,j)}
,邊權為
b
k
{\displaystyle b_{k}}
。再增加一個原點
(
s
,
s
)
{\displaystyle (s,s)}
與所有定點 相連,邊權 均為0(在某些題目中可能需要根據實際情況進行改動)。對這個圖以s為原點運行Bellman-Ford 算法 (或SPFA ),最終
{
d
[
i
]
}
{\displaystyle \{d[i]\}}
即為一組可行解。
例如,考慮這樣一個問題,尋找一個5維向量
x
=
(
x
i
)
{\displaystyle x=(x_{i})}
以滿足:
這一問題等價於找出未知量
x
i
,
i
∈
{
1
,
2
,
3
,
4
,
5
}
{\displaystyle x_{i},i\in \{1,2,3,4,5\}}
,滿足下列8個差分約束條件:
x
2
−
x
5
≤
1
{\displaystyle x_{2}-x_{5}\leq 1}
x
1
−
x
2
≤
0
{\displaystyle x_{1}-x_{2}\leq 0}
x
1
−
x
5
≤
−
1
{\displaystyle x_{1}-x_{5}\leq -1}
x
3
−
x
1
≤
5
{\displaystyle x_{3}-x_{1}\leq 5}
x
4
−
x
1
≤
4
{\displaystyle x_{4}-x_{1}\leq 4}
x
4
−
x
3
≤
−
1
{\displaystyle x_{4}-x_{3}\leq -1}
x
5
−
x
3
≤
−
3
{\displaystyle x_{5}-x_{3}\leq -3}
x
5
−
x
4
≤
−
3
{\displaystyle x_{5}-x_{4}\leq -3}
該問題的一個解為
x
=
(
−
5
,
−
3
,
0
,
−
1
,
−
4
)
{\displaystyle x=(-5,-3,0,-1,-4)}
,另一個解
y
=
(
0
,
2
,
5
,
4
,
1
)
{\displaystyle y=(0,2,5,4,1)}
,這2個解是有聯繫的:
y
{\displaystyle y}
中的每個元素比
x
{\displaystyle x}
中相應的元素大5。
引理 :設
x
=
(
x
1
,
x
2
,
⋯
,
x
n
)
{\displaystyle x=(x_{1},x_{2},\cdots ,x_{n})}
是差分約束系統
A
x
≤
b
{\displaystyle Ax\leq b}
的一個解,d為任意常數,則
x
+
d
=
(
x
1
+
d
,
x
2
+
d
,
⋯
,
x
n
+
d
)
{\displaystyle x+d=(x_{1}+d,x_{2}+d,\cdots ,x_{n}+d)}
也是該系統
A
x
≤
b
{\displaystyle Ax\leq b}
的一個解。
Bellman-Ford 算法 虛擬碼:
# 初始化
for each v in V do
d[v] ← ∞;
d[source] ← 0
# 松弛
for i =1,...,|V|-1 do
for each edge (u,v) in E do
d[v] ← min{d[v], d[u]+w(u,v)}
# 检查负环
for each edge (u, v) in E do
if d[v]> d[u] + w(u,v) then
<无解>
參考資料