差分約束系統詳解
新的整理版本版的地址見我新部落格 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 3159 Candies還是差分約束(棧的SPFA)
相關文章
- 淺談差分約束系統
- POJ 2983-Is the Information Reliable?(差分約束系統)ORM
- POJ 1364-King(差分約束系統)
- 演算法學習之路|差分約束系統演算法
- 差分約束系統+poj1201
- 差分約束學習筆記筆記
- POJ 3169-Layout(差分約束系統-入門裸題)
- POJ 3169(Bellman-Ford演算法,差分約束系統)演算法
- POJ 3159-Candies(差分約束系統-SPFA+鄰接表)
- uva 11478 最短路徑問題(負環,差分約束系統)
- oracle 約束詳解Oracle
- [演算法學習筆記] 差分約束演算法筆記
- 差分約束系統+SPFA/Bellman判斷負權迴路+uva515
- Day2 尤拉路,拓撲排序和差分約束排序
- MySQL——約束(constraint)詳解MySqlAI
- 詳解外來鍵約束(foreign key)
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 時序分析:基礎知識整理(三)差分轉單端的約束等
- 合約跟單系統開發詳解案例,合約跟單系統原始碼原始碼
- 16.Kotlin星投影與泛型約束詳解Kotlin泛型
- Android 約束佈局(ConstraintLayout)1.1.0 版詳解AndroidAI
- 圖文詳解ScrollView子控制元件約束新增View控制元件
- 分投趣(Fintoch)智慧合約系統制度開發詳情
- LP智慧合約理財分紅系統開發詳情模式模式
- 量化交易系統開發之合約詳情講解
- 西瓜莊園(智慧合約)系統程式開發詳解
- 資料庫系統之實體完整性約束資料庫
- 量化合約系統開發(詳解開發)丨合約量化系統開發(說明及案例)
- Oracle定義約束 外來鍵約束Oracle
- NFT智慧合約質押分紅模式開發系統詳情方案模式
- 分投趣fintoch合約系統開發詳情技術介紹
- SQL約束SQL
- Oracle約束Oracle
- oracle 約束Oracle
- 綜合約束
- 資料庫的集合,分頁及約束條件資料庫
- 約束介紹
- Lp分紅USDT合約系統開發(邏輯說明)| Lp分紅USDT合約系統原始碼示例原始碼