模板 差分約束演算法

2021-10-09 23:16:12 字數 873 閱讀 9694

點此看題

首先把不等式轉化成下面的形式:

x u≤

xv+y

x_u\leq x_v+y

xu​≤xv

​+y那麼就相當於v

vv連向u

uu乙個權值為y

yy的邊,然後去跑最短路。

實現用spf

a\tt spfa

spfa

,需要判負環(乙個點入隊大於n

nn次就說明有負環)

#include

#include

using

namespace std;

const

int m =

5005

;int

read()

while

(c>=

'0'&& c<=

'9')

return x*f;

}int n,m,tot,f[m]

,dis[m]

,cnt[m]

,vis[m]

;queue<

int> q;

struct edgee[2

*m];

void

****()

for(

int i=f[u]

;i;i=e[i]

.next)}}

for(

int i=

1;i<=n;i++

)printf

("%d "

,dis[i]);

}int

main()

,f[v]

=tot;

}****()

;}

差分約束 模板

如果需要求的是兩個變數差的最大值,那麼需要將所有不等式轉變成 leq 的形式,建圖後求最短路 如果需要求的是兩個變數差的最小值,那麼需要將所有不等式轉化成 geq 的形式,建圖後求最長路。這是兩個最基本的規則 算是吧 差分約束的精髓就在於建圖,而這玩意兒個人感覺沒什麼好辦法,只能靠不停做題去找到那種...

差分約束模板

如果乙個系統由 n 個變數和 m 個約束條件組成,其中每個約束條件形如 x i x j c k 其中 c k 是常數 可以是負數,也可以是非負數 則稱其為差分約束系統。我們要解決的問題是 求一組解 x 1 a 1,x 2 a 2,x n a n 使得所有的約束條件得到滿足,否則判斷無解。差分約束系統...

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

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