差分約束系統

2021-10-18 20:20:52 字數 3242 閱讀 7208

在通用線性規劃問題中,我們通常給定乙個矩陣a

aa,和乙個未知向量→

x\underset

x→​,和乙個已知向量→

b\underset

b→​。求解矩陣不等式ax≤

bax \leq b

ax≤b

。有時候我們並不關心目標函式,而是希望計算出乙個可行解(或告知無解)。

在乙個差分約束系統中,線性規劃矩陣a

aa每乙個都有且僅有乙個1和-1,其他位置均為0。因此,由ax≤

bax \leq b

ax≤b

所給出的差分約束系統是由m個約束條件,n個變數差額限制條件,其中每乙個約束條件都是類似於下面的不等式xi−

xj≤b

kx_ - x_ \leq b_

xi​−xj

​≤bk

​,其中m為a的行數,n為a的列數,1≤i

,j≤n

,i≠j

1 \leq i,j \leq n,i \neq j

1≤i,j≤

n,i

​=j並且1≤k

≤m

1 \leq k \leq m

1≤k≤m。

定理:如果x

xx是差分約束系統的乙個可行解,那麼對於任意整數d

dd,則向量x+d

ix+di

x+di

同樣是差分約束系統的乙個可行解,其中i

ii為全部元素都是1的向量。

將d加到每乙個xix_

xi​上面,對於約束條件做減法的時候,d就會被消掉,因此加上乙個常數向量還是乙個可行解。

給定差分約束系統,其對應的約束圖是有向圖g=(

v,e)

g=(v,e)

g=(v,e

),v=(v

0,v1

,⋯,v

n)

v=(v_,v_,\cdots,v_)

v=(v0​

,v1​

,⋯,v

n​),e=∪

e=\,v_):x_ - x_ \leq b_ \} \cup \,v_) , (v_,v_) , \cdots ,(v_,v_)\}

e=∪。

對於權值函式w

ww的定義,w0j

=0,w

ij=b

kw_ = 0,w_ = b_

w0j​=0

,wij

​=bk

​。下面的定義將把差分約數系統和圖論最短路建立關係。

定理:差分約數系統的乙個可行解為,x=(

δ(v0

,v1)

,δ(v

0,v2

),⋯,

δ(v0

,vn)

)x=(\delta(v_,v_),\delta(v_,v_),\cdots,\delta(v_,v_))

x=(δ(v

0​,v

1​),

δ(v0

​,v2

​),⋯

,δ(v

0​,v

n​))

證明:考慮任意一條邊(vi

,vj)

(v_,v_)

(vi​,v

j​),根據三角不等式有,δ(v

0,vj

)≤δ(

v0,v

i)+w

ij

\delta(v_,v_) \leq \delta(v_,v_) + w_

δ(v0​,

vj​)

≤δ(v

0​,v

i​)+

wij​

,即δ (v

0,vj

)−δ(

v0,v

i)≤w

ij

\delta(v_,v_) - \delta(v_,v_) \leq w_

δ(v0​,

vj​)

−δ(v

0​,v

i​)≤

wij​

,又因為xi=

δ(v0

,vi)

,xj=

δ(v0

,vj)

x_ = \delta(v_,v_),x_ = \delta(v_,v_)

xi​=δ(

v0​,

vi​)

,xj​

=δ(v

0​,v

j​),因此xj−

xi≤w

ij=b

kx_ - x_ \leq w_ = b_

xj​−xi

​≤wi

j​=b

k​。定理:如果約束圖存在負權環,則差分約束系統無解。

證明:反證法,詳情檢視《演算法導論》。

可以選擇執行一遍bellmanford演算法,也可以進行spfa優化。

p1993

注意條件轉化,在求解dndn

dn陣列的時候,注意到初始化不能設定成最大的陣列,否則相加的時候會出現溢位的問題。

以下是bellman-ford判斷負環演算法。

#include

using

namespace std;

typedef

long

long ll;

#define fr freopen("in.txt", "r", stdin)

struct edge

e[20005];

ll dn[

6000];

int tot =0;

int n, m;

inline

void

add(

int u,

int v, ll w)

intmain()

else

if(op ==2)

else

if(op ==3)

}for

(int i =

1; i <= n; i++

) dn[0]

=0;// negi loop

for(

int cnt =

0; cnt < n; cnt++)}

}for

(int i =

1; i <= tot; i++)}

cout <<

"yes"

;return0;

}

差分約束系統

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