负环
如果图中存在负环,则无论经过多少次迭代,总存在有向边
Belman-Ford 判定负环
若
若
SPFA 判定负环
设
一般情况下,我们使用 SPFA 判定负环,因为其时间复杂度较低。
cpp
/*
与其从每个节点出发尝试寻找负环,不如在原图的基础上建立虚拟源点
原图存在负环,则从虚拟源点出发一定可以找到该负环
虚拟源点与原图中每个节点相连,边权为 0,则 dis[i] = 0
*/
bool spfa() {
queue<int> q;
for (int i = 1; i <= n; i++) {
q.push(i);
vis[i] = true;
}
while (!q.empty()) {
int x = q.front();
q.pop();
vis[x] = false;
for (int i = h[x]; i != -1; i = ne[i]) {
int y = e[i];
if (dis[y] > dis[x] + w[i]) {
dis[y] = dis[x] + w[i];
cnt[y] = cnt[x] + 1;
if (cnt[y] >= n) return true;
if (!vis[y]) {
vis[y] = true;
q.push(y);
}
}
}
}
return false;
}差分约束
差分约束系统定义为一种特殊的
差分约束系统可以转化为图论中的最短路问题,即对于每个约束条件
常用变形技巧:
| 条件 | 转化 | 建边 |
|---|---|---|
