雖然說知道這玩意可是從來沒寫過……同時記錄差分約束原理。
對於給定的式子$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...