差分約束系統詳解
新的整理版本版的地址見我新部落格 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 3169(Bellman-Ford演算法,差分約束系統)演算法
- 差分約束學習筆記筆記
- POJ 3159-Candies(差分約束)
- 差分約束的一些理解
- POJ3159 Candies【差分約束+最短路】
- Atcoder ABC 216 G 01Sequence 題解 [ 藍 ] [ 差分約束 ]
- MySQL——約束(constraint)詳解MySqlAI
- [演算法學習筆記] 差分約束演算法筆記
- Day2 尤拉路,拓撲排序和差分約束排序
- Android 約束佈局(ConstraintLayout)1.1.0 版詳解AndroidAI
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- Javaweb-約束的分類JavaWeb
- XML Schema 字串資料型別及約束詳解XML字串資料型別
- NumPy 差分、最小公倍數、最大公約數、三角函式詳解函式
- 時序分析:基礎知識整理(三)差分轉單端的約束等
- 合約跟單系統開發詳解案例,合約跟單系統原始碼原始碼
- 分投趣(Fintoch)智慧合約系統制度開發詳情
- 約束
- LP智慧合約理財分紅系統開發詳情模式模式
- 量化交易系統開發之合約詳情講解
- 西瓜莊園(智慧合約)系統程式開發詳解
- 資料庫系統之實體完整性約束資料庫
- Javaweb-約束-外來鍵約束JavaWeb
- 量化合約系統開發(詳解開發)丨合約量化系統開發(說明及案例)
- NFT智慧合約質押分紅模式開發系統詳情方案模式
- 分投趣fintoch合約系統開發詳情技術介紹
- 物理引擎脈絡梳理(數值積分、碰撞檢測、約束解決)
- MySQL 約束MySql
- 03約束
- SQL約束SQL
- 約束CONSTRAINTAI
- 演算法隨筆——圖論之差分約束演算法圖論
- defi質押挖礦智慧合約dapp系統開發詳解APP
- (10)邏輯綜合新增約束(環境約束)
- 主鍵約束、唯一約束和唯一索引索引
- DAPP智慧合約LP質押分紅系統開發原始碼詳情方案APP原始碼