单源最短路 SPFA 算法模板

简介

  • 在图论中,最短路是十分重要的一部分,在很多问题中都有涉及

  • 而现在所讲的 SPFA 算法是十分优秀的算法,时间复杂度为 O(kE)

  • 其中 E 是图的边数,而 k 是一个常数,一般极小。

  • 事实上 SPFA 就是在 Bellman-ford 算法的基础上加上一个队列优化,减少了冗余的松弛操作,是一种高效的最短路算法。

  • 而且 SPFA 还能判负环,这种情况下类似 Dijkstra 算法等便没有了用武之地!

用法

  • 在队列中进行,在点出队入队中更新值

  • SPFA算法(BFS)模板如下:

void spfa_bfs(int st)
{
    memset(dis,60,sizeof(dis));
    memset(bz,false,sizeof(bz));
    int l=0,r=1;
    dis[que[1]=st]=0;
    while(l<r)
    {
        int now=que[++l];
        bz[now]=false;
        for(int i=first[now];i;i=next[i])
            if(dis[now]+w[i]<dis[en[i]])
            {
                dis[en[i]]=dis[now]+w[i];
                if(!bz[en[i]]) bz[que[++r]=en[i]]=true;
            }
    }
    return false;
}
  • 注释:其中 que[] 为队列, dis[] 为点到源点距离, lr 分别左右指针, bz[] 为标志->点是否入队。

  • SPFA算法(DFS)模板如下:

void spfa_dfs(int x)
{
    bz[x]=true;
    for(int i=first[x];i;i=next[i])
        if(dis[now]+w[i]<dis[en[i]])
        {
            dis[en[i]]=dis[now]+w[i];
            if(!bz[en[i]]]) spfa(en[i]);
        }
    bz[x]=false;
}  

判负环

  • SPFA算法还有一个大优点是可以判负环

  • 利用 SPFA 算法判断负环有两种方法:

    1. SPFA算法 的 dfs 形式,判断条件是 存在一点在一条路径上出现多次
    2. SPFA算法 的 bfs 形式,判断条件是 存在一点入队次数大于总顶点数

总结

  • SPFA算法效率高,实用性强,是很有用的算法!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值