SPFA算法详解及模板

本文详细介绍了SPFA算法,作为Dijkstra算法的一种优化,它利用队列来寻找单源最短路径,并能判断图中是否存在负环。在算法解释部分,阐述了SPFA如何通过维护一个队列和标记节点进入队列的次数来优化Bellman-Ford算法。当节点进入队列的次数超过节点数量时,可推断出图中存在负环。同时提供了模板问题POJ 3259供读者实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

我们现在熟悉的Dijkstra算法基本思路是:每次寻找已知节点到达未知节点距离最短的一个节点,那么这个位置节点的最短距离我们就知道了,这个未知节点变为已知节点,再去更新未知节点的距离......那么这样我们就需要寻找N-1次就可以找到最终的答案,因为每次我们都会得到一个点的最短距离,当然,Dijkstra算法因为每次都要去找距离已知点中距离最短的点,那么我们就可以使用优先队列来进行优化,这样我们就不用再去遍历寻找了

Bellman-Ford算法相对于Dijkstra算法,他不仅可以得到单源最短路的长度,并且我们还可以判断有没有负环产生,那么我们这里的SPFA算法就是对Bellman-Ford算法的队列优化

算法解释

在SPFA算法中,我们已知一个起点,以及点之间的距离,我们还需要定一个队列,在队列中存放后面可以用来进行松弛操作的点,数组mark表示某个点进入队列的次数

从开始节点遍历边,当遍历到的点不在队列中的时候,将点放入队列,mark对应的值++,并且更新最短距离,当某一个节点进入队列次数大于n的时候,我们就可以判定图中存在负环

模板

POJ 3259

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
#define INF 0x3f3f3f3f

using namespace std;
const int MAXN = 5500;
int n,m,w;

struct Edge
{
    int v,w,next;
}edge[MAXN]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值