1. 程式人生 > 其它 >學習筆記 【差分約束】

學習筆記 【差分約束】

差分約束

差分約束系統 是一種特殊的 \(n\) 元一次不等式組,它包含 \(n\) 個變數, 以及 \(m\) 個約束條件,每個約束條件是由兩個其中的變數做差構成的,形如 \(x_i-x_j\leq c_k\)
我們要解決的問題是:求一組解 ,使得所有的約束條件得到滿足,否則判斷出無解。

差分約束系統中的每個約束條件 \(x_i-x_j\leq c_k\) 都可以變形成 \(x_i\leq x_j+c_k\) ,這與單源最短路中的三角形不等式 \(dis[\,y\,]\leq dis[\,x\,]+z\) 非常相似。因此,我們可以把每個變數 \(x\) 看做圖中的一個結點,對於每個約束條件 \(x_i-x_j\leq c_k\)

,從結點 \(j\) 向結點 \(i\) 連一條長度為 \(c_k\) 的有向邊。

對於\(≤\)號,我們跑最短路,否則跑最長路。

對於一些對解有要求的問題,我們建一個超級原點,對於 \(x_i-x_0 \leq c_0\) 我們設定的 \(c_0\) 為解的上限,若是大於等於則 \(c_0\) 為下限。

但在建圖後不一定存在最短/長路,因為可能存在無限減小/增大的負環/正環,此時就是無解的情況。

解法:

  1. 根據題中的關係推出一些隱含的關係式。
  2. 進行建圖。

不等式標準化:

如果要求取最小值,那麼求出最長路,那麼將不等式全部化成 $ x_i - x_j ≥ k $的形式,這樣建立 \(j->i\)

權值為 \(k\) 的邊,如果不等式組中有 \(x_i - x_j > k\),因為一般題目都是對整形變數的約束,化為 \(x_i - x_j ≥ k+1\) 即可,如果 \(x_i - x_j = k\)呢,那麼可以變為如下兩個:\(x_i - x_j ≥ k\) , \(x_i - x_j \leq k\),建立兩條邊即可。

建好圖之後直接\(\text{spfa}\)\(\text{bellman-ford}\)求解,不能用\(\text{dijstra}\)演算法,因為一般存在負邊,注意初始化的問題。

例題

P3275 [SCOI2011]糖果