author: Ir1d, Anguei, hsfzLZH1
差分约束系统 是一种特殊的
差分约束系统中的每个约束条件
注意到,如果
设
一般使用 Bellman–Ford 或队列优化的 Bellman–Ford(俗称 SPFA,在某些随机图跑得很快)判断图中是否存在负环,最坏时间复杂度为
题目大意:求解差分约束系统,有
题意 | 转化 | 连边 |
---|---|---|
add(a, b, -c); |
||
add(b, a, c); |
||
add(b, a, 0), add(a, b, 0); |
跑判断负环,如果不存在负环,输出 Yes
,否则输出 No
。
??? note "参考代码"
cpp --8<-- "docs/graph/code/diff-constraints/diff-constraints_1.cpp"
不考虑二分等其他的东西,这里只论述差分系统
对每个
下面是用 Bellman–Ford 算法判断图中是否存在负环的代码实现,请在调用前先保证图是连通的。
???+ note "实现"
=== "C++"
cpp bool Bellman_Ford() { for (int i = 0; i < n; i++) { bool jud = false; for (int j = 1; j <= n; j++) for (int k = h[j]; ~k; k = nxt[k]) if (dist[j] > dist[p[k]] + w[k]) dist[j] = dist[p[k]] + w[k], jud = true; if (!jud) break; } for (int i = 1; i <= n; i++) for (int j = h[i]; ~j; j = nxt[j]) if (dist[i] > dist[p[j]] + w[j]) return false; return true; }
=== "Python"
```python
def Bellman_Ford():
for i in range(0, n):
jud = False
for j in range(1, n + 1):
while ~k:
k = h[j]
if dist[j] > dist[p[k]] + w[k]:
dist[j] = dist[p[k]] + w[k]
jud = True
k = nxt[k]
if jud == False:
break
for i in range(1, n + 1):
while ~j:
j = h[i]
if dist[i] > dist[p[j]] + w[j]:
return False
j = nxt[j]
return True
```