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