差分約束系統

2021-07-13 13:42:11 字數 1251 閱讀 4902

這是一篇學習小記。(如果你很趕時間直接跳過前言)

由於本蒟蒻之前沒有接觸過這類題目,所以最近被一道題虐了一下,然後學習了。

其實這個名字很耳熟,只是在我小的時候,聽說了,卻沒有去學習。

好吧,其實現在才這個東西是個非常基礎的東西,但是它的思路極為巧妙。

首先來看一道題。

有一段長度為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就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...