算法札记:SPFA判负环算法的证明

SPFA判负环算法有两种主流判定方式,核心都基于图论的++抽屉原理++完成严谨证明:

++前言:SPFA基于++ bellman-foyd ++,想不通就用bellman-foyd来想想++

一、基于点入队次数的判定证明

  1. 判定规则‌:若图中某节点的入队次数≥总节点数n,则图中存在负环。
  2. 证明逻辑 ‌:
    每次节点入队都对应一次最短路径的松弛更新,且更新后该点对应的最短路边数严格递增。当某点入队n次时,说明它对应的最短路径边数≥n,路径上的节点总数至少为n+1。根据抽屉原理,n个节点的图中,路径必然存在重复出现的顶点,也就是形成了环路。而SPFA仅在路径总权值变小时才会触发松弛更新,因此这个环路的总边权之和必然为负数,即存在负环。

二、基于最短路边数的判定证明

  1. 判定规则‌:维护cnt数组记录从起点到当前节点的最短路径经过的边数,若某点的cnt值≥n,则图中存在负环。
  2. 证明逻辑 ‌:
    若某点的最短路径包含≥n条边,路径上的节点数至少为n+1,再次通过抽屉原理可推导出路径中必然存在重复顶点,也就是形成了环路。结合SPFA的松弛更新规则,只有路径总权值减小才会更新距离,因此该环路的边权和为负,直接判定存在负环。这种方式比统计入队次数效率更高,是工程中更常用的实现方案。

补充说明

为了能检测到图中任意位置的负环,算法初始化时会将所有节点直接加入队列,等价于在原图中新增一个虚拟源点,向所有节点连一条权值为0的边,保证原图中所有负环都能被虚拟源点可达,不会出现漏判的情况。

相关推荐
YH55269845 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
遥感知识服务6 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶6 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆7 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
叩码以求索9 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
北风toto10 小时前
中缀、前缀、后缀表达式
算法·软件设计师
听取WA声一片(无恶意)10 小时前
CSP-J/CSP-S 深度优先搜索(DFS)完全讲义
c++·算法·深度优先
码流怪侠10 小时前
2026年8月GitHub热榜深度拆解:Agent Skills席卷开源圈,一个“技能包“收割5万星
算法·程序员·github
hold?fish:palm10 小时前
30 两两交换链表中的节点
数据结构·算法·链表
Nil20811 小时前
leetcode 98验证二叉搜索树
算法·leetcode·职场和发展