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

相关推荐
云和数据.ChenGuang3 分钟前
LLM大模型对接本地Ollama部署模型
开发语言·人工智能·python·langchain
荆棘鸟智能11 分钟前
短历时洪水预报算法实践:水文模型与 LightGBM 残差订正融合
人工智能·算法·机器人
云和数据.ChenGuang1 小时前
光哥说Python 循环导入(Circular Import)深度解析:成因、排查与解决方案
开发语言·前端·人工智能·python·langchain
葫三生1 小时前
关于三生原理系列被技术开发社区批量收录或引发策展边界讨论的一种思考
大数据·人工智能·深度学习·算法·机器学习·数据挖掘·开源
catcatuncle1 小时前
OpenWorkBuddy 部署排错手册:从源码启动到自己搭一个给团队用,七个最容易卡住的地方
算法
avi91111 小时前
【AI教人】在Inspector显示所有Delegate-Odin Inspector之三
java·前端·算法·delegate·inspector·editor扩展·unity editor
淡海水1 小时前
06-02-源码-增量标记算法实现
算法·unity·c#·gc
TomEval1 小时前
【测AI】第16篇:模型公平性与可解释性测试 — AI 的偏见与黑箱
人工智能·python·功能测试·ai·测试用例
田里的水稻1 小时前
FA_CNN卷积神经网络四---线性层及其拉平PyTorch
人工智能·pytorch·python·深度学习·神经网络·cnn
碧海银沙音频科技研究院1 小时前
实现炬芯ATS308X的usb cdc 串口IAP 固件升级功能实现
人工智能·嵌入式硬件·深度学习·算法