淺談差分約束問題

差分約束

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

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

思路

其實這個問題是挺套路的spa

咱們把給出的式子變一下code

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

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

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

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

那麼對於任意一條邊\((u,v)\)方法

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

可能有些抽象,舉個例子

通過計算不可貴到三個不等式

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

相關文章
相關標籤/搜索