定義:如果乙個系統由n個變數和m個約束條件組成,形成m個形如 ai - aj ≤ k 的不等式(i,j∈[1,n],k為常數),則稱其為差分約束系統(system of difference constraints)。亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。
栗子:給出這樣的一組不等式
a-b < = 3
b-c < = 6
c-d < = 5
e-c < = 2
b-e < = 3
求a-d的最大值。
經過一番腦跑之後,得出答案13。但是我們不能總是腦跑啊。。。費腦子qaq,所以有什麼科學的求法嗎??
我們對a-b < = 3進行移項,改為 a < = b + 3 ,發現類似於最短路中的不等式 de[t] < = de[f] + d ,可以看做是從b到a連了一條權值為3的邊。我們把上面的不等式畫成圖。
發現答案即為d到a的最短路。
為什麼呢??
把圖單個剝離出來看
已知 (1) b-a < = x ;(2) c - b < = y ;(3) c - a < = z .
則c-a 的最大值 即為 1+2 和 3 比較 ,也就是 c-a<=x+y 與 c-a <=z 答案即為 min(x+y,z) (小小取更小),即為從a到c的最短路。
字面理解為b比a最大大x,c比b最大大y,c就比a最大大x+y,c又比a最大大z,所以我們要求乙個x+y和z的最小值。
把它擴充套件為n個點,m條邊的圖,每一條邊都是乙個可傳遞的大小關係。s到t的路徑可以看做許多s與t之間的大小關係(t-s < = ... ),我們要求的t-s的最大值就是最小的限制,也就是a到c最短路。
同理 b-a > = x , c-b > = y , c-a > = z ,也可以抽象為 de[t] > = de[f] + d ,這就轉變為了最長路問題 ,這是求 c-a 的最小值 , 與上面思想相同。
也就是最大求最短,最小求最長。
關於dist的初始化但是題目裡給出的不等式不一定大於小於號的方向相同,如 求最大值時卻給出了 d-e > = q , 只需要轉化成 e-d < = -q 就可以了。(d到e連了一條邊權為-q的邊)。1.如果將源點到各點的距離初始化為0,最終求出的最短路滿足它們之間相互最接近了
2.如果將源點到各點的距離初始化為inf(無窮大),其中之1為0,最終求出的最短路滿足 它們與該點之間相互差值最大。(from baidubaike)
那麼問題又來了,不等式一定有解嗎??
不一定。
數學上,多個不等式的解集分為 空集 , 有限集,無限集(暫且這麼叫qwq)。
發現,若是s無法到t,即為無限多解(沒有限制)。若s到t的路徑上有環(最短路的負環,最長路的正環),無法取到最大值或最小值。
引理:設x=(x1,x2,…,xn)是差分約束系統ax≤b的乙個解,d為任意常數。則x+d=(x1+d,x2+d,…,xn+d)也是該系統ax≤b的乙個解。定理:將如上差分約束系統查查分約束時查到的神犇部落格,十分詳細易理解%%%轉換成圖後,以
為源點得到的最短路徑序列為
(如果有解),則
滿足且若
為任意解,則有
。
栗子 : codevs 2404 糖果
** qwq
1 #include2 #include3 #include4 #include5 #include6 #include7(部分內容參考自各神犇部落格,侵刪 qwq)using
namespace
std;89
intn,k,x,a,b,cnt,f;
10int first[100010],next[400010],rd[100010
];11
long
long de[100010
],ans;
12bool used[100010
];13
14struct
maplerode[400010
];17 dequeq;
1819
void build(int f,int t,int
d)20
;22 next[cnt]=first[f];
23 first[f]=cnt;24}
25void spfa() //
跑最長路
2650}51
}52if(f) break;53
}54}55
intmain()
5667
for(int i=1;i<=n;++i) build(0,i,0); //
i - 0 > = 0
68spfa();
69if(f) cout<
else
75return0;
76 }
HDU 3440 查分約束
點選開啟鏈結 題意 給個n個不同的高度,乙個人從最低點跳躍,每次可以跳到第乙個比它高的位置,最後跳到最高點,然後每次最多可以跳的距離為d,而且在跳躍時可以在不改變給定順序的情況下移動這些高度,使得最後起始點和終點的位置最遠,思路 自己想了一會,想的方向錯了,我自己想的方法是將最小高度記為0,最大高度...
學習筆記 差分約束系統
目錄將邊權取相反數,設此時圖為 g 若 g 無負權環 即 g 無正權環 則有 d v le len v 其中 d v 為在圖 g 上求得的最短路,len v 為源點到 v 的任意路徑權值和。同時可得 d v ge len v 所以可以得到 d v d v 其中 d v 為原圖源點到 v 的最長路。實...
codevs 1242 布局(查分約束 SPFA)
查分約束.給出的約束既有 又有 這時統一化成一種 sb sa x 建邊 a到b 權值為x sb sa y sa sb y 建邊 b到a 權值為 y 然後跑最短路 spfa 判斷到不了終點 判斷負環的死迴圈.include include include include define maxn 200...