來自 https://blog.csdn.net/my_sunshine26/article/details/72849441
差分約束系統
一、概念
二、引例

三、差分約束與最短路模型
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],於是可以聯想到最短路模型中的一部分代碼
-
if(dis[u]+w(u,v)<=dis[v])
-
{
-
dis[v]=dis[u]+w(u,v);
-
}
這不正與松弛操作相似嗎?
但是好像不等號方向剛好相反,但其實這並不矛盾
上面的代碼要實現的是使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