差分約束系統詳解

hr_whisper發表於2014-02-16

新的整理版本版的地址見我新部落格 http://www.hrwhisper.me/?p=1952

差分約束系統就是給出一些形如x-y<=b不等式的約束,問你是否有滿足問題的解,或者求最小,最大解。

這個問題的神奇之處是可以轉化為圖論的最短路問題。


一、預備知識:SPFA演算法

詳見我的最短路演算法詳解(Dijkstra/SPFA/Floyd)

二、差分約束的轉化原理

對於圖論的最短路徑,有:對於d(v) <= d(u) + w(u, v) ,而差分約束系統的解法利用到了單源最短路徑問題中的三角形不等式。

移項得:d(v) - d(u) <= w(u, v),是不是和上面的x-y<=b的一樣?

是的,這就是轉化為最短路徑演算法的原理。

三、建圖

根據題目的意思進建圖。

如POJ 1201 

題目大意:


有一個序列,題目用n個整陣列合 [ai,bi,ci]來描述它,[ai,bi,ci]表示在該序列中處於[ai,bi]這個區間的整數至少有ci個。如果存在這樣的序列,請求出滿足題目要求的最短的序列長度是多少。
思路:

設s[i]為從1~i的整數個數。

這樣對於區間[ a , b]顯然有 S[b] - S[a-1] >=c[i] (為什麼是a-1?因為閉區間a也要選上呀)

然後還有

0<= S[B]-S[B-1] <=1 (整數的話最多比前一個大一,好吧,我大二- -|||我不二啊!!)

變形得:

S[B]-S[B-1] >=0
S[B-1]-S[B]>=-1


四、用SPFA解需要注意的:

1.原圖可能不是連通圖,故需要加一個超級源點S,從S到任意的頂點邊權為0,然後從該點出發。為什麼?新增從虛點S到每個頂點的權為0的邊.這是為了保證構造出來的圖是連通的.由於虛點本身並不引入負圈,所以設定虛點以後最短路仍然存在,並且每個約束仍然滿足.

或者差分約束不用什麼附加頂點, 附加頂點的唯一用處就是保證圖的連通性, 不讓你有負環判不到的情況, 解決這種問題的最佳途徑就是初始把所有頂點都加入佇列, 並且將所有dis

置0, 這就相當於加了一個不存在的附加頂點, 它與所有的頂點的直連長度都是0.

當然推薦第二種,效率也高。


2.如果求最小的解,那麼我們一開始把dis設為無窮小,並且使用最長路。即 if(d[v] < d[u]+w(u,v))    進行更新,而建圖的時候也要用大於等於。

如果求最大,那麼我們一開始把dis設為無窮大,使用最短路。

為什麼?

問得好!(- -|||) 以求解最大的為例(最小解同理)dis[id]一開始為無窮大,圖最短路更新的條件為: if(d[v]>d[u]+w(u,v))   d[v]=d[u]+w(u,v); 通過不斷的鬆弛,使得d的值不斷變小,直到滿足所有條件,也就是說滿足條件的時候就是最大的了~

那麼,我們建圖的時,都轉化為A-B<=C這種形式,以(B為起點,向A連線一條權值為C的邊) 因為圖的最短路有:d[v]- d[u]<=w(u,v); 即( d[v]<=d[u]+w(u,v); )


所以,當你在糾結用小於號大於號的時候,看看題目求的是最大還是最小,如果只是判斷有木有解,那麼大於號小於都可以,只不過要注意全部等式要統一。


題目:

ZOJ 2770 Burn theLinked Camp差分約束 ZOJ排名第一~

POJ 1201 Intervals|| POJ 1716 Integer Intervals差分約束

POJ 2983 Is theInformation Reliable?依舊差分約束

POJ 1275 CashierEmployment挺難的差分約束題

POJ 1364 King (UVA515)差分約束

POJ 3159 Candies還是差分約束(棧的SPFA

POJ 3169 Layout差分約束

UVA 11478 - Halum差分約束



相關文章