SPFA 算法:求有负权的图的最短路
模板
https://www.luogu.com.cn/problem/P3385
import sys
input = sys.stdin.readline
inf = float('inf')
from collections import deque
t = int(input())
for _ in range(t):
n, m = map(int, input().split())
edge = [[] for _ in range(n + 1)]
for _ in range(m):
u, v, w = map(int, input().split())
if w < 0:
edge[u].append((v, w))
else:
edge[u].append((v, w))
edge[v].append((u, w))
dis = [inf] * (n + 1)
vis = [0] * (n + 1)
cnt = [0] * (n + 1) # 记录每个点的入队次数
dis[1] = 0
vis[1] = 1
q = deque()
q.append(1)
flag = 0
while q:
u = q.popleft()
vis[u] = 0
for (v, w) in edge[u]:
if dis[v] > dis[u] + w:
dis[v] = dis[u] + w
if not vis[v]:
q.append(v)
vis[v] = 1
cnt[v] += 1
if cnt[v] > n: # 如果入队次数超过 n,说明存在负环
flag = 1
break
if flag:
break
if flag:
print('YES')
else:
print('NO')
实战演练
https://www.lanqiao.cn/problems/2194/learning/
import sys
input = sys.stdin.readline
inf = float('inf')
from collections import deque
n, m = map(int, input().split())
c = list(map(int, input().split()))
edge = [[] for _ in range(n)]
for _ in range(m):
u, v, w = map(int, input().split())
u -= 1
v -= 1
edge[u].append((v, w))
edge[v].append((u, w))
dis = [inf] * n
vis = [0] * n
dis[0] = 0
q = deque()
q.append(0)
vis[0] = 1
while q:
u = q.popleft()
vis[u] = 0
for v, w in edge[u]:
if v == n - 1:
res = 0
else:
res = c[v]
if dis[v] > dis[u] + w + res:
dis[v] = dis[u] + w + res
if not vis[v]:
q.append(v)
vis[v] = 1
print(dis[n - 1])
END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢