码迷,mamicode.com
首页 > 其他好文 > 详细

hdoj-2544 最短路【dijkstra】

时间:2015-08-18 14:16:32      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

题目http://acm.hdu.edu.cn/showproblem.php?pid=2544

模板题

#include<cstdio>
#include<cstring>//memset
#include<algorithm>//min
#define INF 0x3f3f3f3f
#define maxn 110
using namespace std;//algorithm
int n,m,map[maxn][maxn],dis[maxn];//map[][]两点之间的距离  dis[]起始点(源点)到当前点的距离 
bool visit[maxn];//判断该点是否被访问 

void dijkstra(int s)
{
	int next;//下一个进入(最短距离) V集合的点 
	memset(visit,0,sizeof(visit));// 一开始 V集合中无任何元素 
//	memset(map,INF,sizeof(map));
	for(int i=1;i<=n;i++)//dis初始化  起始点(源点)到当前点的距离 
		dis[i]=map[s][i];
	visit[s]=true;//将源点放入集合V 
	dis[s]=0;//源点到源点的距离为0 
	for(int i=1;i<n;i++)//已经把U集合中的一个点存入V集合 最多进行n-1次寻找最小值 
	{
		int temp=INF;// 一开始默认两点之间的距离为INF 
		for(int u=1;u<=n;u++)
		{
			if(!visit[u]&&dis[u]<temp)//找最小值(该点不在V集合 并且 该点到源点的距离小于 当前值 ) 
			{
				temp=dis[u];
				next=u;
			}
		}
		visit[next]=true;//将离源点最近的点存入V集合 
		for(int u=1;u<=n;u++)//松弛 
		{
			if(!visit[u])
				dis[u]=min(dis[u],dis[next]+map[next][u]);
		}
	}
}

int main()
{
	int a,b,c;
	while(scanf("%d%d",&n,&m),n,m)
	{
		memset(map,INF,sizeof(map));// 不能在dijkstra()中初始化  对map[][]赋值前初始化 
		while(m--)
		{
			scanf("%d%d%d",&a,&b,&c);
			if(map[a][b]>c)//避免重复   上面初始化为INF map仍为INF表示未走过这条路   
				map[a][b]=map[b][a]=c;
		}
		dijkstra(1);
		printf("%d\n",dis[n]);
	}
	return 0;
}


 

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

hdoj-2544 最短路【dijkstra】

标签:

原文地址:http://blog.csdn.net/qq_29606781/article/details/47750217

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!