如果乙個系統由n個變數和m個約束條件組成,其中每個約束條件形如:xj-xi<=bk,其中,1<=i,j<=n, 1<=k<=m。則稱其為差分約束系統(system of difference constraints)。差分約束系統就是求解關於一組變數的不等式組的方法。
求解差分約束系統,可以轉化為圖論中的單源最短路徑問題。
觀察約束條件xj-xi<=bk,會發現它類似於最短路中的三角不等式d[u]<=d[v]+w[u,v](即d[u]-d[v]<=w[u,v])。因此,以每個變數xi為結點,對於約束條件xj-xi<=bk,連線一條邊(i,j),邊權為bk。再增加乙個源點s,s與所有的點相連,邊權為0。對這個圖,執行以s為起點的bellman-ford(或者spfa),最終即為一組可行解。
引理:設x=(x1,x2,…,xn)是差分約束系統ax≤b的乙個解,d為任意常數。則x+d=(x1+d,x2+d,…,xn+d)也是該系統ax≤b的乙個解。
poj3159:發蘋果問題。flymouse是班長,他需要給每個同學發一定數量的蘋果,但是學生之間會有比較,有的學生(編號為a)認為某個學生b的蘋果數不能超過他v個(sb-sa<=v)。flymouse的編號為1,現在要求滿足學生要求,並且使s1 - sn最大。
解:從a到b連線一條有向邊,權值為v。以1為起始點,求到每個點的最短路徑,最終dis[n]即為所求。
poj1364:有乙個國王,它只會算連續的數的加法,假設一串數,給出條件si,ni,operator,ki,意思是從si到si+ni這段數的和》或者
解:設s[i]表示從串開頭1到i的和,s[0]=0,則條件可轉化為:s[ni+si] - s[si-1] > ki(or <)。由於s[i]均為整數,可以轉化為:s[ni+si] - s[si-1] >= ki + 1(or <= ki-1)。先將條件全部轉化為<=形式,再新增超級源點n+1,到其餘各點連線一條邊,權值為0。利用spfa判斷負環的存在。
poj2983:有兩個敵對勢力,a方想弄清楚b方的n個防禦站的位置,通過一些地下組織。地下組織提供多條情報,你要判斷這些情報是否可靠。情報分為兩種:p a b x:a站在b站北邊x公里;v a b:a站在b站北邊至少1公里,但具體多遠不清楚。現在給出n個站和m條情報,判斷這m條情報是否可靠。
解:設s[i]表示i站距離最南邊的距離,s[0]=0,則情報可以轉化為s[a]-s[b]<=x&&s[a]-s[b]>=x;s[a] - s[b]>=1。首先將這些不等式全部轉化為<=,求最短路用bellmanford判斷負環。
poj1201:給出n(n=50000)段連續的整數(整數均小於50000),要求出乙個最小的集合z,至少包含第i段裡面ci個數。
解:s[i]表示z集合從0到i-1中取的整數的個數。對於段[a,b]取不小於c個數,則有:s[b+1]-s[a]>=c。顯然,這是求最長路。(用spfa注意新增源點)
有關差分約束系統建模問題,可參
差分約束系統
差分約束 若 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就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...