差分約束 在數學上 更多被稱爲線性規劃
作爲線性規劃的一種特殊情況
“差分”即意味兩個變量作差
“約束”則意味這個差 滿足一些條件
比如 等於某個值 或 大於某個值 或 小於某個值
例 a - b >= x1
b - c <= x2
a - c == x3
而這類問題在計算機中 也一般只會要求你輸出 第i個變量與第j個變量 的差 最大是多少 最小是多少
—————————————分界線———————————————
對於 大於等於小於 三種情況 在競賽中不容易直接讓電腦理會並得出需要的結果
差分約束 則是通過 將(不)等式轉化爲圖論中的最短(長)路問題
類比 a - b >= x1 與 dis[a] - dis[b] >= x1 ==> dis[a] >= dis[b] + x1
b - c <= x2 dis[b] - dis[c] <= x2 ==> dis[c] >= dis[b] + (-x2)
a - c == x3 dis[a] - dis[c] <= x3 dis[c] >= dis[a] + (-x3)
dis[a] - dis[c] >= x3 dis[a] >= dis[c] + x3
(1) (2) (3)
——————————————分界線——————————————
如上 將(1) 最終轉化成了 (3)
而(3) 則可以通過指定一點的dis爲0 (例如 規定dis[a] = 0)
然後從這個點開始求單源最長路
對於dis[c] >= dis[b] + (-x2) 則可以加一條邊 從b到c 邊權爲-x2
因爲對於最長路 如果i能轉移到j 一定有dis[j] >= dis[i] + w[i][j]
所以這樣求出來的單源最長路一定是滿足所有式子
1 但是有可能最後求出來 目標點的dis沒有被賦值
則說明從起點開始的約束 無法涉及到目標點
即目標點的值與起點的值 沒有任何關係 可以爲任意值
2 也有可能有一個正環 導致死循環
有正環則說明這一組式子不可滿足 例如(a > b + 1 b > a + 1)
____________________________分界線_________________________________________
對於1情況 最終只需要看看dis[final]是不是初始狀態就能判斷
對於2情況 則限制了求最短(長)路只能用spfa (dij不能有負環)
對於一次spfa 若某個點被訪問了N次 則一定有環 (自證不難)便可由此判斷
ps : 將上文的(3)組式子也可以改寫成 a <= b + x的形式 那麼就需要求單源最短路
因爲最短路轉移維護了 dis[v] <= dis[u] + x
來幾道例題練練手吧
poj3169 hdu3440
再來一道不是那麼好建圖的。。 poj1275
(其實差分約束主要就難在建圖。。)