差分約束系統

2022-09-21 15:09:12 字數 1382 閱讀 8510

\(\quad\)這玩意可以解決這樣一類問題:

\(\quad\)能列出一系列形如 \(a+b<=c\) 或者 \(a+b>=c\) 的式子,並要求判斷是否有解,給出一組解。

\(\quad\)觀察這乙個式子 \(a+b<=c\) ,類似於 \(spfa\) 的三角形不等式。那麼我們就可以將 \(a\) 向 \(c\) 連一條長度為 \(b\) 的邊,最後跑一遍最長路,這樣每乙個節點的 \(dist\) 就是一組答案。

設定乙個超級源點,向每乙個點連一條長度為 \(0\) 的邊,然後再去跑最短路/最長路。因為有的時候圖並不是連通的。

如果是區間要滿足條件的話,可以轉換為字首和。

如果是 \(a+b這種式子,並且保證 \(a,b,c\) 是整數,那麼可以將其轉換為 \(a+b-1<=c\)

luogu p3275 [scoi2011]糖果

#include#define int long long

using namespace std;

const int maxn = 500010;

struct e[maxn];

int head[maxn], vis[maxn], dis[maxn], cont[maxn];

int cnt, n, k;

void add(int u, int v, int w)

int spfa(int s) }}

}return 1;

}signed main()

if (opt == 2)

add(u, v, 1);

}if (opt == 3)

if (opt == 4)

add(v, u, 1);

}if (opt == 5)

}if (spfa(0) == 0) cout << -1;

else

return 0;

}

luogu p3084 [usaco13open]photo g

#includeusing namespace std;

int n,m;

const int maxn=800010;

struct

e[maxn];

int head[maxn],vis[maxn],cont[maxn],dis[maxn];

int cnt=0;

void add(int u,int v,int w)

int spfa(int s)

for(int i=1;i<=n;i++) add(i,i-1,0),add(i-1,i,1);

if(!spfa(0)) cout<<-1;

else

return 0;

}

差分約束系統

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