學習筆記 【差分約束】
阿新 • • 發佈:2021-07-29
差分約束
差分約束系統 是一種特殊的 \(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\)
對於\(≤\)號,我們跑最短路,否則跑最長路。
對於一些對解有要求的問題,我們建一個超級原點,對於 \(x_i-x_0 \leq c_0\) 我們設定的 \(c_0\) 為解的上限,若是大於等於則 \(c_0\) 為下限。
但在建圖後不一定存在最短/長路,因為可能存在無限減小/增大的負環/正環,此時就是無解的情況。
解法:
- 根據題中的關係推出一些隱含的關係式。
- 進行建圖。
不等式標準化:
如果要求取最小值,那麼求出最長路,那麼將不等式全部化成 $ x_i - x_j ≥ k $的形式,這樣建立 \(j->i\)
建好圖之後直接\(\text{spfa}\)或\(\text{bellman-ford}\)求解,不能用\(\text{dijstra}\)演算法,因為一般存在負邊,注意初始化的問題。