spfa--Bellman-Ford的队列优化

来源:互联网 发布:大数据双创中心是什么 编辑:程序博客网 时间:2024/05/01 15:17

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];
0 0
原创粉丝点击