返回顶部

关于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求最短路可判断负环,求最长路可判断正环。

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