簡介
差分約束系統(system of difference constraints),是求解關於一組變數的特殊不等式組之方法。
如何乙個系統由n個變數和m個約束條件組成, 其中每個約束條件形如
x[i] - x[j] <= d (i, j ∈ [1, n], t ∈ [1, m])
, 則稱其為差分約束系統。亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。
如果x[i] - x[j] <= d
, 那麼從 j 到 i 鏈結一條長度為d的邊。那麼就是求最短路。
如果x[i] - x[j] >= d
, 那麼從 j 到 i 鏈結一條長度為d的邊。那麼就是求最長路。
判斷有無解
判斷圖有沒有負環即可,如果發現了負環,說明找到了矛盾。
用spfa判負環
123
4567
891011
1213
1415
1617
1819
2021
bool spfa(int s) }}
return 1;
}
dfs判負環
123
4567
891011
1213
1415
1617
1819
2021
2223
2425
2627
28
inline bool spfa(int u)
dis[v] = dis[u] + w;
if (!spfa(v)) }}
vis[u] = 0;
return 1;
}int main()
}cout << "yes\n";
}
例題 1. [scoi2011]糖果
題目鏈結
123
4567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
5455
5657
5859
6061
6263
6465
6667
6869
7071
7273
7475
7677
7879
8081
8283
8485
8687
8889
9091
9293
9495
9697
9899
100101
102103
104105
106
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define eps 1e-8
#define ms(i, val) memset(i, val, sizeof i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pairp;
const int n = 3e5 + 5;
const int m = 3e6 + 5;
const int inf = 0x3f3f3f3f;
const ll ll_max = 4557430888798830399;
inline int read()
while (ch <= '9' && ch >= '0')
return f ? (~ res + 1) : res;
}struct edge ed[m];
int cnt, n, m, head[n], tim[n];
ll dis[n];
bool vis[n];
void init()
inline void add(int u, int v, ll w) ;
head[u] = cnt++;}
dequeq;
inline bool spfa(int u)}}
return 1;}
int main()
for (int i = n; i >= 1; --i)
ll ans = 0;
if (spfa(0))
cout << ans << "\n";
}else cout << "-1\n";
return 0;
}
例題2. hdu3666. the matrix problem
題目鏈結
隱藏比較深的差分約束了。
123
4567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
5455
5657
5859
6061
6263
6465
6667
6869
7071
7273
7475
7677
7879
8081
8283
8485
8687
8889
9091
9293
9495
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define eps 1e-8
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pairp;
const int n = 1001;
const int inf = 0x3f3f3f3f;
const ll ll_max = 4557430888798830399;
struct edge ed[340444];
int cnt, n, m, head[n], tim[n];
bool vis[n];
double dis[n];
queueq;
void init()
void add(int u, int v, double w)
int u, v;
bool spfa(int u)
if (!spfa(v))}}
vis[u] = 0;
return 1;
}double l, u, x;
int main()
}int flag = 1;
for (int i = 1; i <= n + m; ++i)
}if (flag)
puts("yes");
}return 0;
}
1
恰似你一低頭的溫柔,嬌弱水蓮花不勝寒風的嬌羞, 我的心為你悸動不休。 --mingfuyan
差分約束系統
差分約束 若 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就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...