返回顶部

关于spfa

“正常”求最短路

BFS版本

void spfa(){
queueq;
q.push(0);
fl[0]=1;
while(q.size()){
int x=q.front();
q.pop();
fl[x]=0;
for(int i=h[x];i;i=s[i].next){
int y=s[i].to;
if(dis[y]<dis[x]+s[i].w){
dis[y]=dis[x]+s[i].w;
q.push(y);
fl[y]=1;
cnt[y]++;
if(cnt[y]>=n){
flag=1;
return;
}
}
}
}
}

DFS版本

void spfa(int x){
fl[x]=1;
for(int i=h[x];i;i=s[i].next){
if(dis[s[i].to]>dis[x]+s[i].w){
if(fl[s[i].to]||flag){
flag=1;
break;
}
dis[s[i].to]=dis[x]+s[i].w;
spfa(s[i].to);
}
}
fl[x]=0;
}

Tips:

spfa求最短路可判断负环,求最长路可判断正环。

posted @ 2024-03-05 15:08  无敌の暗黑魔王  阅读(46)  评论(0)    收藏  举报