總的開說差分約束問題就是給出一系列不等式然後求問某一式子的最大值或者最小值。
差分約束問題詳解:
比如有這樣一組不等式:
x1 - x2 <= 0
x1 - x5 <= -1
x2 - x5 <= 1
x3 - x1 <= 5 不等式組(1)
x4 - x1 <= 4
x4 - x3 <= -1
x5 - x3 <= -3
x5 - x4 <= -3
全都是兩個未知數的差小於等於某個常數(大於等於也可以,因為左右乘以-1就可以化成小於等於)。這樣的不等式組就稱作差分約束系統。
這個不等式組要麼無解,要麼就有無陣列解。因為如果有一組解的話,那麼對於任何乙個常數k,肯定也是一組解,因為任何兩個數同時加乙個數之後,它們的差是不變的,那麼這個差分約束系統中的所有不等式都不會被破壞。
差分約束系統的解法利用到了單源最短路徑問題中的三角形不等式。即對於任何一條邊u -> v,都有:
d(v) <= d(u) + w(u, v)
其中d(u)和d(v)是從源點分別到點u和點v的最短路徑的權值,w(u, v)是邊u -> v的權值。
顯然以上不等式就是d(v) - d(u) <= w(u, v)。這個形式正好和差分約束系統中的不等式形式相同。於是我們就可以把乙個差分約束系統轉化成一張圖,每個未知數xi對應圖中的乙個頂點vi,把所有不等式都化成圖中的一條邊。對於不等式xi - xj <= c,把它化成三角形不等式:xi <= xj + c,就可以化成邊vj -> vi,權值為c。
在建立圖的時候應該與目標函式的符號相同,=,=,再根據不等式建立圖;
相反,如果是<=,不等式也應該全部變為<=,再建立圖;
(一致性)=或者<=,並非和》
上文就講了如何根據不等式建立圖,哪到底和問題的不等式的最大值或者最小值有什麼關聯呢?
如題目要求d(v) - d(u)的最小值,可以轉換成d(v) - d(u) >=m,而根據上文得知m為u->v的權值。
要想上式子成立,則應有min(d(v) - d(u))>=max(m),即轉成了求u->v最長的路徑即式子的最小值
相同,如果求d(v) - d(u)的最大值,這應該求u->v的最小路徑
對於差分不等式,a - b <= c ,求的是最短路,得到的是最大值;
對於差分不等式 a - b >= c
,求的是最長路,得到的是最小值。
關於補不補充源點:
當d(v) 和d(u)都已在圖中存在,則不需要補充源點。
當圖沒有目標源點的時候或者需要連線整個圖的時候,則需要補充源點。並補充關係。
如果圖中存在負權值迴路,則求出來的最短路徑沒有意義。也就是說不等式無解。所以要從是否有負權值迴路進而判斷有無解。
zoj求最小值:(差分不等式a-b>=c,求最長路,得到最小值)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int dist[1010];
int n,m,a,b,c;
struct edge
cur;
vectorvec[1010];
inline void read(int &m)//int
while(ch>='0'&&ch<='9')
m=x*f;
}bool spfa() //(差分不等式a-b>=c,求最長路,得到最小值)
for(int i=1;i<=m;i++)
if(spfa())
printf("%d\n",dist[n]);
else
printf("bad estimations\n");
} return 0;
}
zoj 3668 差分約束
題意 給定l,r a,b 表示序列從l到r的和 a b。並輸出序列最大的取值,誤解輸出 the spacecraft is broken 查分約束 u v 建條邊 則有dis v dis u w u,v 即dis v dis u w u,v sum r 表示0到r的和。則sum r sum l 1 ...
ZOJ1455差分約束
這題做了之後發現自己對差分約束好像終於懂了一點,開始看了roll神的做最長路才a掉 後來自己想了老半天想出來了最短路怎麼寫 最長路版 include include include include include include include include include include inc...
zoj4028(差分約束)
題意 給你以i為結尾的最長上公升子串行的值,和每個值的區間範圍求可行的a i 題解 差分約束,首先滿足l i a i r i 可以建乙個虛擬節點n 1,那麼有a n 1 a i l i a i a n 1 r i 同時當 f i f j i include include include inclu...