Bellman-Ford的队列优化(求某点到所有点的最短距离)

原创 2016年08月29日 21:06:10

思路:

将源点入队,从源点开始邻点便利,判断所有邻点中是否需要更新,将需要更新的更新完后判断此点是否在队列内,若不在,将此点入队,重复此过程。

#include<cstdio>
using namespace std;
int u[8],v[8],w[8];
int first[6],next[8];
int dis[6],book[6];
int que[101],head=1,tail=1;
const int inf=999999999;
int main(){
	int i,j,k,m,n;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++){
		dis[i]=inf;
	}
	dis[1]=0;//默认源点是1
	for(i=1;i<=n;i++)first[i]=-1;
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&u[i],&v[i],&w[i]);
		next[i]=first[u[i]];
		first[u[i]]=i;
		//有点像链式前向星 不知道是不是 
	}
	que[tail]=1;//入队 
	tail++;
	book[1]=1;//将点1标为已经入队 
	while(head<tail){
		k=first[que[head]];
		while(k!=-1){//存在这个点 
			if(dis[v[k]]>dis[u[k]]+w[k]){
				dis[v[k]]=dis[u[k]]+w[k];//注意不管在不在队列内只要相邻就要判断是否要更新 
				if(book[v[k]]==0){//更新了并且此点不在队列内 
					que[tail]=v[k];//入队 
					tail++;
					book[v[k]]=1;
				}
			}
			k=next[k];//找下一个相邻点 
		}
		book[que[head]]=0;//出队 
		head++;
	}
	for(i=1;i<=n;i++){
		printf("%d ",dis[i]);
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Bellman-Ford——解决负权边(求某点到所有点的最短距离)

Bellman-Ford与dijkstra一样 都是求某点到所有点的最短距离 先说一下Bellman-Ford的思路:将m条变全部枚举(假设第i条边连接的点是u[i].v[i])判断v[i]到...

Bellman-Ford算法和队列优化(SPFA)——求单源最短路径

来源自我的博客 http://www.yingzinanfei.com/2017/04/07/bellman-fordsuanfaheduilieyouhuaspfaqiudanyuanzuidu...

单点最短路径算法 bellman-ford模板和队列优化后的spfa算法模板

bellman-ford算法 spfa算法模板

hdu(2544)——最短路(邻接表+bellman-ford使用队列优化)

又一次做了最短路。。只不过这回使用邻接表写的。。 一开始wa了好久。。 无向图建立邻接表和有向图的区别就是就是要把两边都加进去就好啦。 #include #include #include #in...

总结一下最短路径的贝尔曼-福特算法(Bellman-Ford)及用队列优化(spfa)

关于贝尔曼福特算法: 百度百科:贝尔曼-福特算法 ---------------------------------------------------------------------------...

SPFA(bellman-ford的队列优化)

SPFA算法思想: bellman-ford算法的时间复杂度较高,O(n^3)或者O(nm),原因在于算法要递推n次,且每次递推要扫描所有的边,并且在这个过程中很多遍是多余的.SPFA就是利用队列减...

Bellman-Ford算法的队列优化

上一篇文章对Bellman-Ford算法的一种优化是每次仅对最短路程发生了变化的点的相邻边执行优化操作。这里可以用队列来维护这些点 #include using namespace std;...
  • Icarus_
  • Icarus_
  • 2016年03月05日 13:55
  • 235

Bellman-Ford的队列优化

Bellman-Ford的队列优化 Bellman-Ford算法的另一种优化:每次仅对最短路程发生变化的点的相邻边执行松弛操作。 每次选取队首顶点u,对顶点u的所有出边进行松弛,例如u->v的边,如果...
  • zero_zp
  • zero_zp
  • 2017年07月27日 10:29
  • 111

Bellman-Ford算法及其队列优化与实战入门

Bellman-Ford算法能解决负权边的图,就是说能够来判断存在负环。先来看一下核心代码: dis[i] 为源点到i点的最短路 for(k = 1; k ...
  • Rain722
  • Rain722
  • 2016年09月01日 17:34
  • 168

从零开始学算法(八)最短路径之Bellman-Ford算法的队列优化以及几种最短路径算法对比

前言 从上篇博客的,Bellman-Ford算法介绍的最后一部分,我们指出,其实,可以对该算法进行进一步的优化。原因是因为:其实在每一轮松弛操作结束后,就会有一些顶点已经求得其最短路径。此后这些顶点...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bellman-Ford的队列优化(求某点到所有点的最短距离)
举报原因:
原因补充:

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