差分約束算法總結


來自 https://blog.csdn.net/my_sunshine26/article/details/72849441

 

差分約束系統

一、概念

 
                  如果一個系統由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.
在這個過程中,我們是否想到這種方法與我們已經學的一種算法有所聯系,是的,就是最短路算法。
 

三、差分約束與最短路模型

 

1、與最短路模型的聯系

 

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

我們觀察上面例子中的不等式,都是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],於是可以聯想到最短路模型中的一部分代碼

  1.  
    if(dis[u]+w(u,v)<=dis[v])
  2.  
    {
  3.  
    dis[v]=dis[u]+w(u,v);
  4.  
    }

這不正與松弛操作相似嗎?

但是好像不等號方向剛好相反,但其實這並不矛盾

上面的代碼要實現的是使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的最短路,兩者剛好吻合。所以求解差分約束問題就轉化為了最短路問題。

 

2.問題解的存在性

 

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

 

    (1)、存在負環

 

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

     (2)、終點不可達

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

 

3、不等式組的轉化

 

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

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

(2)方程給出:X[n-1]-X[0]<T, 可以轉化為X[n-1]-X[0]<=T-1。

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

 

4、應用

 

對於不同的題目,給出的條件都不一樣,我們首先需要關注問題是什么,如果需要求的是兩個變量差的最大值,那么需要將所有不等式轉變成"<="的形式,建圖后求最短路;相反,如果需要求的是兩個變量差的最小值,那么需要將所有不等式轉化成">=",建圖后求最長路。

 

5、相關題目鏈接

 

(1)、POJ 1716 Integer Intervals 

(2)、HDOJ 3666 THE MATRIX PROBLEM  

--------------------- 本文來自 Dust_Heart 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/my_sunshine26/article/details/72849441?utm_source=copy 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM