用SPFA解決差分約束問題(推薦)

2021-08-04 08:38:29 字數 2181 閱讀 9568

此文出處: 第四大點

差分約束系統就是給出一些形如x-y<=b不等式的約束,問你是否有滿足問題的解,或者求最小,最大解。

這個問題的神奇之處是可以轉化為圖論的最短路問題。

(一)原理

對於圖論的最短路徑,有:對於d(v) <= d(u) + w(u, v) ,而差分約束系統的解法利用到了單源最短路徑問題中的三角形不等式。

移項得:d(v) – d(u) <= w(u, v),是不是和上面的x-y<=b的一樣?

是的,這就是轉化為最短路徑演算法的原理。

(二)建圖

差分約束最難的地方在於建圖。

1.求最小的解

有乙個序列,題目用n個整數組合 [ai,bi,ci]來描述它,[ai,bi,ci]表示在該序列中處於[ai,bi]這個區間的整數至少有ci個。如果存在這樣的序列,請求出滿足題目要求的最短的序列長度是多少。

我們可以設s[i]為從[1,i]閉區間內的整數個數。

那麼顯然對於組合[a,b,c] 我們有 s[b] – s[a-1] >= c (a-1是因為我們需要算上a)

還有:0<= s[b]-s[b-1] <=1

變形得s[b]-s[b-1] >=0

s[b-1]-s[b] >=-1

接著,對於求最小值的來說,我們用最長路來求解。為什麼是最長路?一開始把距離d設為無窮小,之後最長路的更新公式為:if(d[v] < d[u]+w(u,v)) d[v]=d[u]+w(u,v); 可以看到d[v]不斷的增大,即當滿足條件的時候為最小的解。

所以我們在建圖的時候,需要滿足最長路的三角不等式: d(v) >= d(u) + w(u, v) =>d(v) – d(u) >=w(u,v) 的形式=>從u到v連線一條權重為w(u,v)的邊。

故本題中三個不等式都是如下的形式:

s[b] – s[a-1] >= c

s[b]-s[b-1] >=0

s[b-1]-s[b] >=-1

題解見筆者csdn:

2.求最大的解

一些母牛按公升序排成一條直線。有兩種要求,a和b距離(a < b)不得超過x,還有一種是c和d(c < d)距離不得少於y,問可能的最大距離。如果沒有輸出-1,如果可以隨便排輸出-2,否則輸出最大的距離。

題目按公升序排,所以有:

s[i] – s[i-1] >=0

由題目的約束條件得到:

b – a <= x

d – c >= y

因為題目求的是最大距離,故用最短路來求解

最短路三角不等式為 d(v) <= d(u) + w(u,v) => d(v) – d(u) <= w(u,v) =>從u到v連線一條權重為w(u,v)的邊

所以我們都轉化為小於等於的符號,所以有:

s[i-1] – s[i] <=0

b – a <= x

c – d <= -y

建完圖後spfa即可。(有負環說明無解輸出-1 , 1與n不連通說明可以隨意擺放,沒有約束嘛。輸出-2,否則輸出dis [n])

題解見筆者csdn:

(三)注意點

1.不等式取》=還是<=

當你在糾結用小於號大於號的時候,看看題目求的是最大還是最小,如果只是判斷有木有解,那麼大於號小於都可以,只不過要注意全部等式要統一。

當求解最大解,使用最短路徑求解, 由圖最短路徑的三角不等式:

d(v) <= d(u) + w(u,v) => d(v) – d(u) <= w(u,v) =>從u到v連線一條權重為w(u,v)的邊

求最大的解用最短路,為d(v) – d(u) <= w(u,v) 的形式

求最小的解用最長路,為d(v) – d(u) >= w(u,v) 的形式

2.圖不連通

原圖可能不是連通圖,故需要加乙個超級源點s,從s到任意的頂點邊權為0,然後從該點出發。為什麼?新增從虛點s到每個頂點的權為0的邊.這是為了保證構造出來的圖是連通的.由於虛點本身並不引入負圈,所以設定虛點以後最短路仍然存在,並且每個約束仍然滿足.

或者差分約束不用什麼附加頂點, 附加頂點的唯一用處就是保證圖的連通性, 不讓你有負環判不到的情況, 解決這種問題的最佳途徑就是初始把所有頂點都加入佇列, 並且將所有dis

置0, 這就相當於加了乙個不存在的附加頂點, 它與所有的頂點的直連長度都是0.

當然推薦第二種,效率也高。

設計 SPFA 差分約束

有n nn頭牛,現在要設計乙個順序讓他們站成一排給他們餵食。奶牛們按照編號順序依次站立,允許有多隻牛站在同一位置。有一些牛希望之間的距離在某個範圍內,也有一些牛希望兩之間的距離大於等於某個距離。如果存在某種方案滿足上述要求,請你輸出1 11號牛和n nn號牛之間最大距離。i np ut input ...

spfa 差分約束模板

cf1131d 給出乙個n m關係表,有 三種關係,要求為這n m個物件分配乙個值,使得滿足約束關係且最大值最小。用差分約束,轉化為 x 1。轉化為 且 如果y要比x至少大1,就建立邊x指向y。對於這樣一張圖,滿足所有要求其實就意味著能走的邊都走 滿足關係 不能滿足的點就鬆弛 變大 類似求最長路。b...

POJ3169差分約束 SPFA 差分約束

思路 假設i j 兩隻奶牛可以站在同乙個位置,但是必須公升序排列,所以有差分約束方程d i d i 1 0 對於兩隻有好感的奶牛有差分約束方程d j d i k 對於兩隻反感的奶牛有差分約束方程d i d j k 有了約束方程就可以spfa include include include inclu...