差分約束-圖論

原文鏈接:https://blog.csdn.net/consciousman/article/details/53812818

差分約束系統


一、何爲差分約束系統:

差分約束系統(system of difference constraints),是求解關於一組變數的特殊不等式組之方法。如果一個系統由n個變量和m個約束條件組成,其中每個約束條件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),則稱其爲差分約束系統(system of difference constraints)。亦即,差分約束系統是求解關於一組變量的特殊不等式組的方法。

通俗一點地說,差分約束系統就是一些不等式的組,而我們的目標是通過給定的約束不等式組求出最大值或者最小值或者差分約束系統是否有解。

比如:


二、差分約束系統的求解:

差分約束系統可以轉化爲圖論來解決,對應於上面的不等式組,如果要求出x3-x0的最大值的話,疊加不等式可以推導出x3-x0<=7,最大值即爲7,我們可以通過建立一個圖,包含6個頂點,對每個xj-xi<=bk,建立一條i到j的有向邊,權值爲bk。通過求出這個圖的x0到x3的最短路可以知道也爲7,這是巧合嗎?並不是。

之所以差分約束系統可以通過圖論的最短路來解,是因爲xj-xi<=bk,會發現它類似最短路中的三角不等式d[v] <=d[u]+w[u,v],即d[v]-d[u]<=w[u,v]。而求取最大值的過程類似於最短路算法中的鬆弛過程。

三角不等式:(在此引用大牛的博客)

B - A <= c     (1)

C - B <= a     (2)

C - A <= b     (3)

 如果要求C-A的最大值,可以知道max(C-A)= min(b,a+c),而這正對應了下圖中C到A的最短路。 

                                

因此,對三角不等式加以推廣,變量n個,不等式m個,要求xn-x1的最大值,便就是求取建圖後的最短路。

同樣地,如果要求取差分約束系統中xn-x1的最小值,便是求取建圖後的最長路。最長路可以通過spfa求出來,只需要改下鬆弛的方向即可,即if(d[v] < d[u] + dist(u,v)) d[v] = d[u] + dist(u,v)。當然我們可以把圖中所有的邊權取負,求取最短路,兩者是等價的。

最長路求解算法證明如下:

http://www.cnblogs.com/g0feng/archive/2012/09/13/2683880.html

最後一點,建圖後不一定存在最短路/最長路,因爲可能存在無限減小/增大的負環/正環,題目一般會對應於不同的輸出。判斷差分約束系統是否存在解一般判環即可。


3、差分約束系統的應用

差分約束系統的應用很廣,都會有一定的背景,我們只需要根據題意構造出差分約束系統,然後再根據題目的要求求解就行了。

一般題目會有三種情況:(1)、求取最短路 (2)、求取最長路 (3)、判斷差分約束系統的解是否存在

當然這三種也可能會相互結合。

 

差分約束系統的解法如下:

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算法,因爲一般存在負邊,注意初始化的問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章