算法札记: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的边,保证原图中所有负环都能被虚拟源点可达,不会出现漏判的情况。

相关推荐
朝朝辞暮i8 分钟前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
Evand J41 分钟前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
海绵宝宝转agent1 小时前
leetCode100算法开源笔记分享
笔记·算法
写后端的胖头鱼2 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
hahaha60162 小时前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉
海绵宝宝转agent2 小时前
基于Redis ZSet+AOP+注解实现限流注解算法
数据库·redis·算法
All for pursuit.3 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青3 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq3 小时前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq3 小时前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询