1. 程式人生 > >淺談差分約束問題

淺談差分約束問題

最短 HR .html 求解 不難 pos 表示 聯想 html

差分約束

差分約束是解決這樣一類問題

給出\(n\)個形如\(x[j]-x[i]<=k\)的式子,求\(x[n]-x[1]\)的最大/最小值

思路

其實這個問題是挺套路的

我們把給出的式子變一下

\(x[j]-x[i]<=k\)

\(x[j]<=x[i]+k\)

我們不難聯想到圖論中最短路的性質

假設\(d[x]\)表示\(1\)\(x\)的最短路

那麽對於任意一條邊\((u,v)\)

\(d[v]<=d[u]+k\)(k表示邊權)

可能有些抽象,舉個例子

技術分享圖片

經過計算不難得到三個不等式

  1.(3)                 x3 - x0 <= 8
  2.(2) + (5)           x3 - x0 <= 9
  3.(1) + (4) + (5)     x3 - x0 <= 7

這樣的話,我們在滿足條件的情況下\(x[3]-x[0]\)最大為\(7\)

我們按上面的方法建出圖

技術分享圖片

不難發現圖中的最短路就是我們想要的答案!

難道這是巧合麽?

肯定不是。仔細觀察不難發現,我們連邊的過程其實就是在轉換不等式,求最短路其實就是求最小的限制條件。這樣求出來的最短路即為滿足條件的最大值

總結

這玩意兒其實挺套路的

如果你找出了題目中的限制條件,直接建圖就好

最大值—>把所有式子整理為\(x[j]-x[i]<=k\),從\(i\)\(j\)連一條邊權為\(k\)的邊,跑最

最小值—>把所有式子整理為\(x[j]-x[i]>=k\),從\(i\)\(j\)

連一條邊權為\(k\)的邊,跑最

在求解的時,因為經常要判斷負環,所以選用SPFA算法

當一個點的入隊次數超過\(n\)時必定出現負環

例題

幾道水題

POJ1201

POJ1275

HDU3440

還有兩道\(n\)年以前做的,沒寫題解

洛谷P1993

洛谷P3275

淺談差分約束問題