1. 程式人生 > >差分約束系統詳解(轉化為最短路)

差分約束系統詳解(轉化為最短路)

差分約束系統中:

如果求未知數的最大值,那麼按小於等於建圖後求最短路即可。(因為求最短路是由無窮向下約束而得到的,所以得到的一定是最大值)。

如果求未知數的最小值,那麼按小於等於建圖後求最長路即可。

注意所有資料的關係,不能漏掉關係,還有與附加源點的關係。

如果是按大於等於建圖:

求最大值,建圖後求最長路;

求最小值,建圖後求最短路。

因為大於等於建圖後,相當於未知數都 * -1了,所以求出結果後需要 * -1。

①:對於差分不等式,a - b <= c ,建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 
②:對於不等式 a - b >= c ,建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值 
③:存在負環的話是無解 
④:求不出最短路(dist[ ]沒有得到更新)的話是任意解

 

一直不知道差分約束是什麼型別題目,最近在寫最短路問題就順帶看了下,原來就是給出一些形如x-y<=b不等式的約束,問你是否滿足有解的問題

好神奇的是這類問題竟然可以轉換成圖論裡的最短路徑問題,下面開始詳細介紹下

比如給出三個不等式,b-a<=k1,c-b<=k2,c-a<=k3,求出c-a的最大值,我們可以把a,b,c轉換成三個點,k1,k2,k3是邊上的權,如圖

由題我們可以得知,這個有向圖中,由題b-a<=k1,c-b<=k2,得出c-a<=k1+k2,因此比較k1+k2和k3的大小,求出最小的就是c-a的最大值了

根據以上的解法,我們可能會猜到求解過程實際就是求從a到c的最短路徑,沒錯的....簡單的說就是從a到c沿著某條路徑後把所有權值和k求出就是c -a<=k的一個

推廣的不等式約束,既然這樣,滿足題目的肯定是最小的k,也就是從a到c最短距離...

理解了這裡之後,想做題還是比較有困難的,因為題目需要變形一下,不能單純的算..

首先以poj3159為例,這個比較簡單,就是給出兩個點的最大差,然後讓你求1到n的最大差,直接建圖後用bellman或者spfa就可以過了

稍微難點的就是poj1364,因為他給出的不等式不是x-y<=k形式,有時候是大於號,這樣需要我們去變形一下,並且給出的還是>,<沒有等於,都要變形

再有就是poj1201,他要求出的是最長距離,那就要把形式變換成x-y>=k的標準形式

注意點:

1. 如果要求最大值想辦法把每個不等式變為標準x-y<=k的形式,然後建立一條從y到x權值為k的邊,變得時候注意x-y<k =>x-y<=k-1

   如果要求最小值的話,變為x-y>=k的標準形式,然後建立一條從y到x的k邊,求出最長路徑即可

2.如果權值為正,用dj,spfa,bellman都可以,如果為負不能用dj,並且需要判斷是否有負環,有的話就不存在


在一個差分約束系統(system of difference constraints)中,線性規劃矩陣A的每一行包含一個1和一個-1,A的其他所有元素都為0。因此,由Ax≤b給出的約束條件是m個差分約束集合,其中包含n個未知量,對應的線性規劃矩陣A為m行n列。每個約束條件為如下形式的簡單線性不等式:xj-xi≤bk。其中1≤i,j≤n,1≤k≤m。

例如,考慮這樣一個問題,尋找一個5維向量x=(xi)以滿足:

這一問題等價於找出未知量xi,i=1,2,…,5,滿足下列8個差分約束條件:

x1-x2≤0

x1-x5≤-1

x2-x5≤1

x3-x1≤5

x4-x1≤4

x4-x3≤-1

x5-x3≤-3

x5-x4≤-3

    該問題的一個解為x=(-5,-3,0,-1,-4),另一個解y=(0,2,5,4,1),這2個解是有聯絡的:y中的每個元素比x中相應的元素大5。

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

約束圖

在一個差分約束系統Ax≤b中,m X n的線性規劃矩陣A可被看做是n頂點,m條邊的圖的關聯矩陣。對於i=1,2,…,n,圖中的每一個頂點vi對應著n個未知量的一個xi。圖中的每個有向邊對應著關於兩個未知量的m個不等式中的一個。

   給定一個差分約束系統Ax≤b,相應的約束圖是一個帶權有向圖G=(V,E),其中V={v0,v1,…,vn},而且E={ (vi,vj) : xj-xi≤bk是一個約束}∪{ (v0,v1) , (v0,v2) , … , (v0,vn) }。引入附加頂點v0是為了保證其他每個頂點均從v0可達。因此,頂點集合V由對應於每個未知量xi的頂點vi和附加的頂點v0組成。邊的集合E由對應於每個差分約束條件的邊與對應於每個未知量xi的邊(v0,vi)構成。如果xj-xi≤bk是一個差分約束,則邊(vi,vj)的權w(vi,vj)=bk(注意i和j不能顛倒),從v0出發的每條邊的權值均為0。

  
定理:給定一差分約束系統Ax≤b,設G=(V,E)為其相應的約束圖。如果G不包含負權迴路,那麼x=( d(v0,v1) , d(v0,v2) , … , d(v0,vn) )是此係統的一可行解,其中d(v0,vi)是約束圖中v0到vi的最短路徑(i=1,2,…,n)。如果G包含負權迴路,那麼此係統不存在可行解。

差分約束問題的求解

由上述定理可知,可以採用Bellman-Ford演算法對差分約束問題求解。因為在約束圖中,從源點v0到其他所有頂點間均存在邊,因此約束圖中任何負權迴路均從v0可達。如果Bellman-Ford演算法返回TRUE,則最短路徑權給出了此係統的一個可行解;如果返回FALSE,則差分約束系統無可行解。

   關於n個未知量m個約束條件的一個差分約束系統產生出一個具有n+1個頂點和n+m條邊的約束圖。因此採用Bellman-Ford演算法,可以再O((n+1)(n+m))=O(n^2+nm)時間內將系統解決。此外,可以用SPFA演算法進行優化,複雜度為O(km),其中k 為常數。