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

原创 2013年12月01日 21:46:45

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;
}


 

 




                

SPFA_dfs的优化

摘自WC2009 姜碧野的《SPFA 算法的优化与应用》 poj对就的题目有3621 2949 1.2.1:基于 Dfs 的 SPFA的基本原理 在上面的介绍的算法中,我们用一个循环队列...
  • zz_ylolita
  • zz_ylolita
  • 2013年11月02日 11:09
  • 2453

hdu 1428 漫步校园(记忆化搜索+宽搜最短路)

漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi...
  • u013123021
  • u013123021
  • 2015年08月11日 13:42
  • 406

谈宽搜SPFA算法和深搜优化SPFA

SPFA算法是最短路的万能算法。 本文就宽搜和深搜的两种写法来谈,深搜优化主要解决优化判负环的速度。值得一看!...
  • xuechen_gemgirl
  • xuechen_gemgirl
  • 2017年07月25日 00:59
  • 278

用BFS找最短路,并打印路径

转自:http://lingyibin.javaeye.com/blog/849828 我想大部分人都用Floyd或者Dijstra算法,甚至dfs算过最短路吧。其实BFS也可以计算最短路。(补充:本...
  • jphaoren
  • jphaoren
  • 2011年03月29日 13:11
  • 3943

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

SPFA  在形式上和BFS非常类似,不同的是BFS中一个点出了队列就不可能重新进入队列,但是SPFA中 一个点可能在出队列之后再次被放入队列,也就是一个点改进过其它的点之后,过了一段时间可能本 身被...
  • u010126535
  • u010126535
  • 2013年12月01日 21:46
  • 778

bfs和bfs

写在最前的三点: 1、所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次。 2、实现bfs和dfs都需要解决的一个问题就是如何存储图。一般有两种方法:邻接矩阵和邻接表。这里为简单起 ...
  • Jiang_youge
  • Jiang_youge
  • 2016年07月23日 11:03
  • 213

【转载】SPFA最短路算法解析

SPFA是一个比较高效的算法,虽说在比较大的数据时仍然无法比Dijkestra+Heap快,但是代码却很简单,以我的水平而言,代码要短上一倍以上。SPFA这个算法的实用性比较强,所以在OI中是一个相当...
  • Dream_Lolita
  • Dream_Lolita
  • 2016年08月08日 09:32
  • 250

最短路算法详解(Dijkstra/SPFA/Floyd)

常用的图论最短路算法详解(dijkstra/SPFA/floyd)
  • murmured
  • murmured
  • 2014年02月16日 13:08
  • 2702

最快最好用的——spfa算法

转自:点击打开链接     求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm。      SPFA算法是西南交通大学段凡丁于1994年发表的...
  • xunalove
  • xunalove
  • 2017年04月11日 09:38
  • 3058

非常可乐(BFS和最短路)

原题链接 非常可乐 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u SubmitStat...
  • qq_31805821
  • qq_31805821
  • 2016年08月04日 23:28
  • 142
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bfs和spfa最短路算法的区别,细节
举报原因:
原因补充:

(最多只允许输入30个字)