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

相关推荐
我材不敲代码1 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
0思必得04 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
-dzk-4 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
韩立学长4 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
qq_192779874 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
风筝在晴天搁浅4 小时前
hot100 78.子集
java·算法
Jasmine_llq4 小时前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率
超级大只老咪4 小时前
快速进制转换
笔记·算法
u0109272714 小时前
使用Plotly创建交互式图表
jvm·数据库·python
爱学习的阿磊4 小时前
Python GUI开发:Tkinter入门教程
jvm·数据库·python