总结一下最短路径的贝尔曼-福特算法(Bellman-Ford)及用队列优化(spfa)

本文详细介绍了贝尔曼-福特算法,包括其原始版本的时间复杂度为O(NM)的特性,以及如何通过队列优化将时间复杂度降低到O(N)。算法不仅能用于寻找最短路径,还能检测图中是否存在负权回路。在n-1轮松弛操作后仍存在距离减少的情况,则表明图中包含负权回路。
摘要由CSDN通过智能技术生成

关于贝尔曼福特算法,假设有n个顶点,我们只需要遍历n-1轮就可以了,因为在一个含n个顶点的图中,任意两点之间的最短路径最多含有n-1条边, 什么原理,我就不讲了,网上大牛博客很多,我在这里上一点干货:

1.最原始的贝尔曼福特算法,时间复杂度为O(NM):


再次学习


//板子
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=5005;
int n,m;
struct node
{
    int w;
    int v;
    int nex;
} e[N];
int firs[N],tot;
void edge(int u,int v,int w)
{
    e[tot].w=w;
    e[tot].v=v;
    e[tot].nex=firs[u];
    firs[u]=tot++;
}
int dis[N],vis[N];
void spfa(int u)
{
    memset(dis,inf,sizeof(dis));
    dis[u]=0;
    memset(vis,0,sizeof(vis));
    vis[u]=1;
    queue<int>q;
    q.push(u);
    while(!q.empty())
    {
        int p=q.front();
        q.pop();
        vis[p]=0;
        for(int i=firs[p]; i!=-1; i=e[i].nex)
        {
            if(dis[p]+e[i].w<dis[e[i].v])
            {
                dis[e[i].v]=dis[p]+e[i].w;
                if(!vis[e[i].v])
                {
                    q.push(e[i].v);
                    vis[e[i].v]=1;
                }
            }
        }
    }
}
int main()
{
    while(~scanf(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值