一、定義
如果乙個系統由n個變數和m個約束條件組成,形成m個形如ai-aj≤k的不等式(i,j∈[1,n],k為常數),則稱其為差分約束系統(system of difference constraints)。亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。
觀察xj-xi<=bk,會發現它類似最短路中的三角不等式d[v]<=d[u]+w[u,v],即d[v]-d[u]<=w[u,v] [1] 。因此,以每個變數xi為結點,對於約束條件xj-xi<=bk,連線一條邊(i,j),邊權為bk。我們再增加乙個源點s,s與所有定點相連,邊權均為0。對這個圖,以s為源點執行bellman-ford演算法(或spfa演算法),最終即為一組可行解。
二、實現
求解差分約束系統,可以轉化成圖論的單源最短路徑(或最長路徑)問題。
並且,在實際應用中,多使用spfa演算法實現。
那麼如果在乙個未知數定死的情況下,要求其它所有未知數的最小值怎麼辦?只要反過來求最長路徑就可以了。最長路徑中的三角不等式與最短路徑中相反:
d(v) >= d(u) + w(u, v)
也就是 d(v) - d(u) >= w(u, v)
所以建圖的時候要先把所有不等式化成大於等於號的。其它各種過程,包括證明為什麼解出的是最小值的證法,都完全類似。
三、應用
總之對於不同的題目,給出的條件都不一樣,我們首先需要關注問題是什麼,
①求 xn-x1 的最大值:
將所有不等式化為 a-b<=w 的形式,對每個不等式建邊:b 到 a 權值為 w
②求 xn-x1 的最小值
將所有不等式化為 a-b>=w 的形式,對每個不等式建邊:b 到 a 權值為-w
四、不等式組的轉化
做題時可能會遇到不等式中的符號不相同的情況,但我們可以對它們進行適當的轉化
(1)方程給出:x[n-1]-x[0]>=t ,可以進行移項轉化為: x[0]-x[n-1]<=-t。
(2)方程給出:x[n-1]-x[0](3)方程給出:x[n-1]-x[0]=t,可以轉化為x[n-1]-x[0]<=t&&x[n-1]-x[0]>=t,再利用(1)進行轉化即可
例題:
題目描述
bessie 在過去的 m 天內參加了 n 次**。但她已經忘了她每次**是在哪個時候了。
對於第 i 次**,bessie 記得它不早於第 si 天進行。另外,她還有 c條記憶,每條記憶形如乙個三元組 (a,b,x),含義是第 b 次**在第a 次**結束至少 x天後進行。
現在請你幫 bessie 算出在滿足所有條件的前提下,每次**的最早日期。
保證 bessie 的記憶沒有錯誤,這意味著一定存在一種合法的方案,使得:
第 i 次**不早於第 si天進行,且不晚於第 m 天進行;所有的記憶都得到滿足;
輸入格式
第一行三個整數 n,m,c。保證 1≤n,c≤105,92≤m≤109。
接下來一行包含 n 個整數 s1,s2,…,sn,
下面 c行每行三個整數 a,b,x,描述一條記憶。
輸出格式
輸出 n行,每行乙個整數,第 i 行的數表示第 i 次**的最早日期。
輸入輸出樣例
輸入4 10 3
1 2 3 4
1 2 5
2 4 2
3 4 4輸出1
638思路
題解:
#include
using
namespace std;
struct node e[
1000086];
int n, m, c;
int cnt;
int head[
1000086];
int dist[
1000086];
int sum[
1000086];
int vis[
1000086];
int s[
1000086];
const
int inf =
0x3f3f3f3f
;void addedge (
int u,
int v,
int w)
bool spfa ()}
}return
false;}
int main (
)for
(int i =
1, u, v, w; i <= c; i++
)bool hahaha =
spfa()
;for
(int i =
1; i <= n; i++
)printf
("%d\n"
, dist[i]);
return0;
}
差分約束系統
差分約束 若 s a s b k 建一條b到a 的長度為k的邊 若s a s b k 建一條b到a 的長度為 k的邊 是求最小值的最長路 是求最大值的最短路 注意到最短路演算法的鬆弛操作 if d j d i w i j d j d i w i j 這其中的三角形不等式 d j d i w i j ...
差分約束系統
差分約束系統 對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值 存在負環的話是無解 求不出最短路 dist 沒有得到更新 的話是任意解 第三 一種建圖方法 設...
差分約束系統
差分約束系統 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 不等式組 1 全都是兩個未知數的差小於等於某個常數 大於等於也可以,因為左右乘以 1就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...