洛谷5960 模板 差分約束演算法 題解

2022-05-16 11:55:48 字數 1031 閱讀 8737

雖然說知道這玩意可是從來沒寫過……同時記錄差分約束原理。

對於給定的式子$x-y\le c$,移動之得$x\le y+c$。

轉換為圖論模型,做起點,終點,權值為$y,x,c$的邊,可發現如果我們對這個圖跑最短路(先不要管怎麼跑出來的233),那麼一定有$dis[x]\le dis[y]+c$。

也就是說,此時每個點的$dis$值即為一組解,自然,有負環時無解。

現在就是怎麼跑最短路的問題了,如果我們隨便取一些點那麼就會有一些點跑不到,就會出問題,於是我們設乙個起點,對每條邊連一條邊權為0的單向邊,這樣我們只需要對這個起點跑一次spfa即可。

其本質是多構造了$u\le $起點的不等式。

#include#include

#include

#include

#include

#include

using

namespace

std;

const

int n=5e3+5

;const

int m=1e4+5

;const

int inf=1e9;

inline

intread()

while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return w?-x:x;

}struct

nodee[m];

intn,m,k,p,cnt,head[n],dis[n],sum[n];

bool

vis[n];

inline

void add(int u,int v,int

w)queue

q;bool spfa(int

s) }}}

return0;

}int

main()

if(spfa(0))puts("no"

);

else

return0;

}

洛谷 P5960 模板 差分約束演算法(差分約束)

題目中x1 x 1 y1可以轉變為 x1 x 1 y1 換一下字母更顯然易見 dis v dis u edge i w 那麼便可以轉換成圖上的最短路問題 解集 因為題中並沒有說明是聯通圖,可以設乙個超級源點,然後向每個節點連一條邊權為0的邊,然後從0點開始做最短路。注意建邊是從x 1連向x1。ac ...

P5960 模板 差分約束演算法

我記得以前寫過差分約數的部落格,可是找不到了,就再寫一遍吧。a b k a b k 要求最終結果滿足這個式子,加源點跑最短路,若能跑出來,則最終一定滿足。include include include include include include include define ll long lo...

P5960 模板 差分約束演算法

h yp erli nk hyperlink hyperl ink de scri ptio ndescription descri ptio n 給定乙個形如xi xj y x i x j leq y xi xj y的n nn元一次不等式組 求x xx的一組整數解 s ol utio nsolut...