差分約束系統 變相的最短路

2021-09-01 06:34:00 字數 2753 閱讀 2679

之前沒有細看,想不明白這個問題怎麼和最短路扯上關係,細細看了看,,也沒明白,,原因是在看dijk演算法的時候就沒好搞明白它的**實現,以至於這個問題模擬到最短路實現的時候一臉懵,還去瞅了瞅三角不等式是什麼東西,簡單來說,難就難在圖的構造上面,構造好圖之後就是模板,就是之前的內容了,一起看看這個東西吧,,

one:

two:

three:

給定m個一元不等式,以及n個變數x1-xn,【m個不等式即為m個約束條件】,求一組x1-xn的解。這個解呢,可以有很多個,可能只有1個,所以會衍生出3類問題:1》求任意兩個變數差的最大值 ;2》求任意兩個變數差的最小值 ;3》求有沒有一組解能滿足所有的約束條件;【三類問題隨命題人心情出現,可能單獨出現,可能成對出現】

給定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的最大值。

解題思路:

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

比如,在這個例子中:

由 (3) 得到:x3 - x0<=4;

由 (1) (4) (5) 得到: x3 - x0<=5;

由 (2) (5) 得到:x3 - x0<=3;

要同時滿足這三個式子,則最後結果就是這裡面最小的值:3 。【因為要同時滿足所有的式子!所以最大的取值即為所有式子集合的最小值,領會精神】。

2》在這個過程中,有沒有有點像最短路演算法?

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

觀察上面例子中的不等式,都是 x[ i ] - x[ j ] <= a[ k ],進行移項,轉化成為 x[ i ] <= x[ j ] + a[ k ] 的形式,我們令 a[ k ] = w(j, i),dis[ i ]=x[ i ],並使i=v,j=u,那麼原始就變為:dis[ u ]+w( u , v ) >= dis[ v ],於是可以聯想到最短路模型中的一部分**:

if(dis[u]+w(u,v)<=dis[v])
這不正與鬆弛操作相似嗎?

3》但是好像不等號方向剛好相反?這並不矛盾:上面的**要實現的是:使dis[ u ]+w( u , v ) > dis[ v ];而對於不等式,我們進行建邊的操作:對於每個不等式 x[i] - x[j] <= a[k],對結點 j 和 i 建立一條 j -> i的有向邊,邊權為a[k],求x[n-1] - x[0] 的最大值就是求 0 到n-1的最短路,兩者剛好吻合。所以求解差分約束問題就轉化為了最短路問題【雖然我也不太明白為毛如此巧妙】。

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

1》存在負環:如果路徑中出現負環,就表示最短路可以無限小,即不存在最短路,那麼在不等式上的表現即x[n-1] - x[0] <= t中的t無限小,得出的結論就是 x[n-1] - x[0] 的最大值不存在【聯想:滿足所有不等式,有乙個滿足不了的,就需要盡力去滿足,有乙個式子小於負無窮,你說人家怎麼滿足這個條件?】。在spfa實現過程中體現為某一點的入隊次數大於節點數。

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

1》根據條件把題意通過變數組表達出來得到不等式組,注意要發掘出隱含的不等式,比如說前後兩個變數之間隱含的不等式關係。

2》進行建圖:

首先根據題目的要求進行不等式組的標準化。

(1)、如果要求取最小值,那麼求出最長路,那麼將不等式全部化成xi – xj >= k的形式,這樣建立j->i的邊,權值為k的邊,如果不等式組中有xi – xj > k,因為一般題目都是對整形變數的約束,化為xi – xj >= k+1即可,如果xi – xj = k呢,那麼可以變為如下兩個:xi – xj >= k, xi – xj <= k,進一步變為xj – xi >= -k,建立兩條邊即可。

(2)、如果求取的是最大值,那麼求取最短路,將不等式全部化成xi – xj <= k的形式, 這樣建立j->i的邊,權值為k的邊,如果像上面的兩種情況,那麼同樣地標準化就行了。

(3)、如果要判斷差分約束系統是否存在解,一般都是判斷環,選擇求最短路或者最長路求解都行,只是不等式標準化時候不同,判環地話,用spfa即可,n個點中如果同乙個點入隊超過n次,那麼即存在環

值得注意的一點是:建立的圖可能不聯通,我們只需要加入乙個超級源點,比如說求取最長路時圖不聯通的話,我們只需要加入乙個點s,對其他的每個點建立一條權值為0的邊圖就聯通了,然後從s點開始進行spfa判環。最短路類似。

3》建好圖之後直接spfa或bellman-ford求解,不能用dijstra演算法,因為一般存在負邊,注意初始化的問題。       

這應該也算是最短路演算法的應用了,**是要根據題目的形式去變換的,我還木有做題,,先把大佬的部落格mark住!

K Candies 差分約束 最短路)

有n個孩子,m個關係 關係分別有3個數u,v,w。代表v的糖果數不能多於u w個,也就是dis v dis u w 這就轉換成 if dis v dis u w dis v dis u w.1 spfa stack include include include include includecon...

CSP 差分約束系統和最短路求解

題目重述 思路概述 題目原始碼 c 差分約束系統,是一種不等式系統,形式比較固定。具體的形式如下 對於差分約束系統一般有兩種形式 1 xi xj ck,求解的上限 即xi xj ck的情況 2 xi xj ck,求解的下限 即xi xj ck的情況 對這兩種情況,可以使用相同的轉換思路,將xj移到不...

2018 08 07 最短路徑 差分約束

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n表示成都的大...