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

相关推荐
d***95621 小时前
爬虫自动化(DrissionPage)
爬虫·python·自动化
APIshop1 小时前
Python 零基础写爬虫:一步步抓取商品详情(超细详解)
开发语言·爬虫·python
sin_hielo1 小时前
leetcode 2872
数据结构·算法·leetcode
二川bro2 小时前
AutoML自动化机器学习:Python实战指南
python·机器学习·自动化
dragoooon342 小时前
[优选算法专题八.分治-归并 ——NO.49 翻转对]
算法
AI科技星2 小时前
为什么宇宙无限大?
开发语言·数据结构·经验分享·线性代数·算法
杨超越luckly2 小时前
基于 Overpass API 的城市电网基础设施与 POI 提取与可视化
python·数据可视化·openstreetmap·电力数据·overpass api
Zero-Talent3 小时前
位运算算法
算法
不穿格子的程序员3 小时前
从零开始刷算法——双指针-三数之和&接雨水
算法·双指针
q***23573 小时前
python的sql解析库-sqlparse
数据库·python·sql