差分約束系統詳解

2021-08-22 03:27:02 字數 1509 閱讀 6412

**:

如果乙個系統由n個變數和m個約束條件組成,形成m個形如ai-aj≤k的不等式(i,j∈[1,n],k為常數),則稱其為差分約束系統。

給定n個變數和m個不等式,每個不等式的形式為 x[i] - x[j] <= a[k] (0 <= i, j < n, 0 <= k < m, a[k]已知),求 x[i] - x[j] 的最大值。

例如當n = 4,m = 5,給出如下圖所示的不等式組,求x3 - x0的最大值。

一般思路:我們可以嘗試把幾個不等式組合得到最後我們要求的式子,於是這些式子裡最小的那個就是答案。

比如,在這個例子中:

由(3)推出: x3 - x0 <= 4;

由(1)、(4)、(5)推出: x3 - x0 <= 5;

由(2)、(5) 推出: x3 - x0 <= 3;

因為需要滿足所有的差分條件,所以綜上所得最後結果就是3(最小的約束條件).

在這個過程中,我們是否想到這種方法與我們已經學的一種演算法有所聯絡,是的,就是最短路演算法。

先給出結論:求解差分約束系統,都可以轉化成圖論的單源最短路徑(或最大解)問題。

我們觀察上面例子中的不等式,都是x[i] - x[j] <= a[k],那麼我們就可以建一條從 j->i 的邊,邊權為a[k](這樣跑出來的最短路就會是最大解),最後求x[n-1] - x[0] 的最大值就是求 0 到n-1的最短路,兩者剛好吻合。所以求解差分約束問題就轉化為了最短路問題。

由於在求解最短路時會出現存在負環或者終點根本不可達的情況,在求解差分約束問題時同樣存在

如果路徑中出現負環,就表示最短路可以無限小,即不存在最短路,那麼在不等式上的表現即x[n-1] - x[0] <= t中的t無限小,得出的結論就是 x[n-1] - x[0]的最大值不存在(無解)。在spfa實現過程中體現為某一點的入隊次數大於節點數。(貌似可以用sqrt(num_node)來代替減少執行時間)

這種情況表明x[n-1]和x[0]之間沒有約束關係,x[n-1] - x[0]的最大值無限大,即x[n-1]和x[0]的取值有無限多種。在**實現過程中體現為dis[n-1]=inf。

做題時可能會遇到不等式中的符號不相同的情況,但我們可以對它們進行適當的轉化

(1)方程給出:x[n-1]-x[0]>=t ,可以進行移項轉化為: x[0]-x[n-1]<=-t。

(2)方程給出:x[n-1]-x[0](3)方程給出:x[n-1]-x[0]=t,可以轉化為x[n-1]-x[0]<=t&&x[n-1]-x[0]>=t,再利用(1)進行轉化即可

對於不同的題目,給出的條件都不一樣,我們首先需要關注問題是什麼,如果需要求的是兩個變數差的最大值,那麼需要將所有不等式轉變成"<="的形式,建圖後求最短路;相反,如果需要求的是兩個變數差的最小值,那麼需要將所有不等式轉化成">=",建圖後求最長路,你把上面的樣例改下符號推倒下就出來了。

例題:poj-3169 layout(判斷了以上所有情況,可以去做做)

差分約束系統詳解

差分約束系統 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 不等式組 1 全都是兩個未知數的差小於等於某個常數 大於等於也可以,因為左右乘以 1就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...

差分約束系統詳解

差分約束系統詳解 一直不知道差分約束是什麼型別題目,最近在寫最短路問題就順帶看了下,原來就是給出一些形如x y b不等式的約束,問你是否滿足有解的問題 好神奇的是這類問題竟然可以轉換成圖論裡的最短路徑問題,下面開始詳細介紹下 比如給出三個不等式,b a k1,c b k2,c a k3,求出c a的...

差分約束系統詳解

一直不知道差分約束是什麼型別題目,最近在寫最短路問題就順帶看了下,原來就是給出一些形如x y b不等式的約束,問你是否滿足有解的問題 好神奇的是這類問題竟然可以轉換成圖論裡的最短路徑問題,下面開始詳細介紹下 比如給出三個不等式,b a k1,c b k2,c a k3,求出c a的最大值,我們可以把...