這是一篇學習小記。(如果你很趕時間直接跳過前言)
由於本蒟蒻之前沒有接觸過這類題目,所以最近被一道題虐了一下,然後學習了。
其實這個名字很耳熟,只是在我小的時候,聽說了,卻沒有去學習。
好吧,其實現在才這個東西是個非常基礎的東西,但是它的思路極為巧妙。
首先來看一道題。
有一段長度為n的序列,點分為特殊點和一般點。有q個提示,提示形如(x,y,c)的三元組,表示序列中的區間[x,y]中至少有c個特殊點。提示保證特殊點的分配方案唯一。現在要求哪些點是特殊點。我們設s[
i]表示[1
,i] 中有s[
i]個特殊點。
那麼我們的提示(x
,y,c
) 可以轉換為這樣的約束:s[
y]−s
[x−1
]≥c
當然,還有一些隱含的約束條件: ∀i
∈[1,
n],0
≤s[i
]−s[
i−1]
≤1具體如何約束,可以這樣構圖:
對於三元組,令x−
1 向
y 連一條長度為
c的邊;
對於隱含約束,令i−
1 向
i 連一條長度為
0的邊,
i 向i−
1連一條長度為−1
的邊。
然後跑一邊最長路,求出了所有的
s ,若s[
i]−s
[i−1
]=1,則說明
i 是乙個特殊點,其實
s就相當於普通最短路中的di
s 。
至於這樣做的原理,可以用最短(其實可能是最長)路的性質來解釋。
設有兩個點u,
v∈g ,di
s[u]
表示源點到
u 的最長距離,w(
u,v)
表示(u,
v)的邊權。 那麼d
is[u
]≥di
s[v]
+w(u
,v)(
1)恆成立。
而我們的約束化成一般形式即s[
u]−s
[v]≥
c 移項,恰好與
1 式等價。所以這就是我們將c作為
w(u,
v)的原因。
當然具體題目中因題而定到底是最短路還是最長路。
差分約束系統
差分約束 若 s a s b k 建一條b到a 的長度為k的邊 若s a s b k 建一條b到a 的長度為 k的邊 是求最小值的最長路 是求最大值的最短路 注意到最短路演算法的鬆弛操作 if d j d i w i j d j d i w i j 這其中的三角形不等式 d j d i w i j ...
差分約束系統
差分約束系統 對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值 存在負環的話是無解 求不出最短路 dist 沒有得到更新 的話是任意解 第三 一種建圖方法 設...
差分約束系統
差分約束系統 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 不等式組 1 全都是兩個未知數的差小於等於某個常數 大於等於也可以,因為左右乘以 1就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...