《學習筆記》 查分約束系統

2022-08-13 22:42:10 字數 2609 閱讀 8440

定義:如果乙個系統由n個變數和m個約束條件組成,形成m個形如 ai - aj ≤ k 的不等式(i,j∈[1,n],k為常數),則稱其為差分約束系統(system of difference constraints)。亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。

栗子:給出這樣的一組不等式

a-b < = 3

b-c < = 6

c-d < = 5

e-c < = 2

b-e < = 3

求a-d的最大值。

經過一番腦跑之後,得出答案13。但是我們不能總是腦跑啊。。。費腦子qaq,所以有什麼科學的求法嗎??

我們對a-b < = 3進行移項,改為 a < = b + 3 ,發現類似於最短路中的不等式 de[t] < =  de[f] + d ,可以看做是從b到a連了一條權值為3的邊。我們把上面的不等式畫成圖。

發現答案即為d到a的最短路。

為什麼呢??

把圖單個剝離出來看

已知 (1) b-a < = x ;(2) c - b < = y ;(3) c - a < = z .

則c-a 的最大值 即為 1+2 和 3 比較 ,也就是 c-a<=x+y 與 c-a <=z 答案即為 min(x+y,z) (小小取更小),即為從a到c的最短路。

字面理解為b比a最大大x,c比b最大大y,c就比a最大大x+y,c又比a最大大z,所以我們要求乙個x+y和z的最小值。

把它擴充套件為n個點,m條邊的圖,每一條邊都是乙個可傳遞的大小關係。s到t的路徑可以看做許多s與t之間的大小關係(t-s < = ... ),我們要求的t-s的最大值就是最小的限制,也就是a到c最短路。

同理 b-a > = x , c-b > = y , c-a > = z ,也可以抽象為 de[t] > = de[f] + d ,這就轉變為了最長路問題 ,這是求 c-a 的最小值 , 與上面思想相同。

也就是最大求最短,最小求最長。

關於dist的初始化

1.如果將源點到各點的距離初始化為0,最終求出的最短路滿足它們之間相互最接近了

2.如果將源點到各點的距離初始化為inf(無窮大),其中之1為0,最終求出的最短路滿足 它們與該點之間相互差值最大。(from  baidubaike)

但是題目裡給出的不等式不一定大於小於號的方向相同,如 求最大值時卻給出了 d-e > = q , 只需要轉化成 e-d < = -q 就可以了。(d到e連了一條邊權為-q的邊)。

那麼問題又來了,不等式一定有解嗎??

不一定。

數學上,多個不等式的解集分為 空集 , 有限集,無限集(暫且這麼叫qwq)。

發現,若是s無法到t,即為無限多解(沒有限制)。若s到t的路徑上有環(最短路的負環,最長路的正環),無法取到最大值或最小值。

引理:設x=(x1,x2,…,xn)是差分約束系統ax≤b的乙個解,d為任意常數。則x+d=(x1+d,x2+d,…,xn+d)也是該系統ax≤b的乙個解。定理:將如上差分約束系統

轉換成圖後,以

為源點得到的最短路徑序列為

(如果有解),則

滿足且若

為任意解,則有

查查分約束時查到的神犇部落格,十分詳細易理解%%%

栗子 : codevs 2404 糖果

** qwq

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;89

intn,k,x,a,b,cnt,f;

10int first[100010],next[400010],rd[100010

];11

long

long de[100010

],ans;

12bool used[100010

];13

14struct

maplerode[400010

];17 dequeq;

1819

void build(int f,int t,int

d)20

;22 next[cnt]=first[f];

23 first[f]=cnt;24}

25void spfa() //

跑最長路

2650}51

}52if(f) break;53

}54}55

intmain()

5667

for(int i=1;i<=n;++i) build(0,i,0); //

i - 0 > = 0

68spfa();

69if(f) cout<

else

75return0;

76 }

(部分內容參考自各神犇部落格,侵刪 qwq)

HDU 3440 查分約束

點選開啟鏈結 題意 給個n個不同的高度,乙個人從最低點跳躍,每次可以跳到第乙個比它高的位置,最後跳到最高點,然後每次最多可以跳的距離為d,而且在跳躍時可以在不改變給定順序的情況下移動這些高度,使得最後起始點和終點的位置最遠,思路 自己想了一會,想的方向錯了,我自己想的方法是將最小高度記為0,最大高度...

學習筆記 差分約束系統

目錄將邊權取相反數,設此時圖為 g 若 g 無負權環 即 g 無正權環 則有 d v le len v 其中 d v 為在圖 g 上求得的最短路,len v 為源點到 v 的任意路徑權值和。同時可得 d v ge len v 所以可以得到 d v d v 其中 d v 為原圖源點到 v 的最長路。實...

codevs 1242 布局(查分約束 SPFA)

查分約束.給出的約束既有 又有 這時統一化成一種 sb sa x 建邊 a到b 權值為x sb sa y sa sb y 建邊 b到a 權值為 y 然後跑最短路 spfa 判斷到不了終點 判斷負環的死迴圈.include include include include define maxn 200...