點此看題
首先把不等式轉化成下面的形式:
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 ...