【算法】图论 —— SPFA 算法 python

SPFA 算法:求有负权的图的最短路


模板

https://www.luogu.com.cn/problem/P3385

python 复制代码
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/

python 复制代码
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
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢

相关推荐
心静财富之门3 分钟前
退出 for 循环,break和continue 语句
开发语言·python
txinyu的博客5 分钟前
map和unordered_map的性能对比
开发语言·数据结构·c++·算法·哈希算法·散列表
WJSKad123510 分钟前
YOLO11-FDPN-DASI实现羽毛球拍与球的实时检测与识别研究
python
幻云201019 分钟前
Next.js之道:从入门到精通
人工智能·python
搞笑症患者19 分钟前
压缩感知(Compressed Sensing, CS)
算法·最小二乘法·压缩感知·正交匹配追踪omp·迭代阈值it算法
0和1的舞者21 分钟前
GUI自动化测试详解(三):测试框架pytest完全指南
自动化测试·python·测试开发·自动化·pytest·测试
im_AMBER23 分钟前
Leetcode 101 对链表进行插入排序
数据结构·笔记·学习·算法·leetcode·排序算法
大神君Bob37 分钟前
【AI办公自动化】教你使用Pytho让Word文档处理自动化
python
快手技术41 分钟前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
颜酱43 分钟前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法