我是靠谱客的博主 威武秋天,最近开发中收集的这篇文章主要介绍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; 
	queue<int>q;
	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; 
	queue<int>q;
	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最短路算法的区别,细节的全部内容,希望文章能够帮你解决bfs和spfa最短路算法的区别,细节所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部