bfs和spfa最短路算法的区别,细节

SPFA  在形式上和BFS非常类似,不同的是BFS中一个点出了队列就不可能重新进入队列,但是SPFA中
一个点可能在出队列之后再次被放入队列,也就是一个点改进过其它的点之后,过了一段时间可能本
身被改进,于是再次用来改进其它的点,这样反复迭代下去。

判断有无负环:如果某个点进入队列的次数超过V次则存在负环(SPFA无法处理带负环的图)。

 

而需要记住的是,又是不同的题目,也许用spfa(多了 一个vis[u]=0)会超时,也可能用spfa更忧;所以要随时变通!

 

int bfs(int s)
{
	memset(vist,0,sizeof(vist));
	memset(dist,0x3f,sizeof(dist));
	int u,v; 
	queueq;
	vist[s]=1;  
	dist[s]=0;
	q.push(s);
	while(!q.empty())
	{
		u=q.front();
		q.pop();
		for(int i =head[u]; i!=-1 ; i=edge[i].next)
		{
			v=edge[i].v;
			  if(dist[v] > dist[u]+edge[i].c)
			  {
			  	     
  			  	     dist[v] = dist[u]+edge[i].c ;
			  	     if(!vist[v])
			  	     {
			  	        vist[v]=1;
					 q.push(v); 	
				     } 
			  }
		}	
	}
	return 0;
}


 

 

int SPFA(int s)
{
	memset(vist,0,sizeof(vist));
	memset(dist,0x3f,sizeof(dist));
  	int u,v; 
	queueq;
	vist[s]=1;  
	dist[s]=0;
	q.push(s);
	while(!q.empty())
	{
		u=q.front();
		q.pop();
		vist[u]=0;//差别在这
		for(int i =head[u]; i!=-1 ; i=edge[i].next)
		{
			v=edge[i].v;
			  if(dist[v] > dist[u]+edge[i].c)
			  {
			  	     
  			  	     dist[v] = dist[u]+edge[i].c ;
			  	     if(!vist[v])
			  	     {
			  	        vist[v]=1;
					q.push(v); 	
				     } 
			  }
		}	
	}
	return 0;
}

 
  

 

 

 
  
 
  
 
 

你可能感兴趣的:(bfs和spfa最短路算法的区别,细节)