关于spfa
“正常”求最短路
BFS版本
void spfa(){
queue<int>q;
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求最短路可判断负环,求最长路可判断正环。