spfa--Bellman-Ford的队列优化

spfa是一种神奇的最短路算法。
它既可以快速的找最短路,有可以判断负循环。
还是很好用的。
代码也比较简单。
STL;
核心思想:
与其他的思想差不了多少,不断的判断。
如果这个点的距离被更新,它附近的点也会进队列的。
只是多了个判断。
~因为负权环会无限的进入队列。
是吧?

以下是代码:

//假如有n个点,dis记录距离,p数组判断是否在队列中,sum记录进入队列的次数
q.push(1); 
dis[1]=0;p[1]=1;sum[1]++;
while(!q.empty()){
    int k=q.front();
    q.pop();
    p[k]=0;
    for(int i=begin[k];i;i=next[i]){//链式前向星
        int u=to[i];
        if(!p[u] && dis[u]>dis[k]+w[u]){
            dis[u]=dis[k]+w[u];
            if(!p[u]){
                q.push(u);
                p[u]=1; 
                sum[u]++;
                if(sum[u]>n){
                    flag=1;
                    break;
                    }
                }
            }
        }
    }
    if(flag==1)printf("此图含有负权环");
    return dis[m];
    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/qq_35776579/article/details/52453290
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞