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];