hdu 2544 最短路(Dijkstra)

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 83849    Accepted Submission(s): 36275


Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

 

Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
 

Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
 

Sample Input
 
  
2 11 2 33 31 2 52 3 53 1 20 0
 
Sample Output
 
  
32

思路:最短路径,查找即可,代码如下(借鉴书上代码):

#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define MaxN 10010
#define MaxInt 200000000
int map[MaxN][MaxN],dist[MaxN];
bool mark[MaxN];
int n,start,e;
int main()
{
	int min1,minj,temp;
	int a,b,c;
	while(scanf("%d%d",&e,&n)!=EOF)
	{
		if(e==0&&n==0)
		 break;
		start=1;
		for(int i=1;i<=e;i++)
		  for(int j=1;j<=e;j++)
		    map[i][j]=map[j][i]=MaxInt;
	    for(int i=0;i<n;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			map[a][b]=map[b][a]=c;
		 }    //初始化 
		 for(int i=1;i<=e;i++)
		   dist[i]=MaxInt;
		 memset(mark,0,sizeof(mark));
		 dist[start]=0;         //把起点并入集合,搜索时即可从起点寻找到第一条最短的边 
		 for(int i=1;i<=e-1;i++)
		 {
		 	min1=MaxInt;
		 	for(int j=1;j<=e;j++)    //查找到原集合的最短的边 
		 	{
		 		if(!mark[j]&&dist[j]<min1)
		 		{
		 			min1=dist[j];
		 			minj=j;
				 }
			 }
			 mark[minj]=1;
			/*每并入一个点都要对原来的边进行修正,保证任意时刻源点到目标点的距离都是最短的*/ 
			 for(int j=1;j<=e;j++)
			 {
			 	if(!mark[j]&&map[minj][j]>0)
				 {
				 	temp=dist[minj]+map[minj][j];
				 	if(temp<dist[j])
				 	 dist[j]=temp;
				}			 
			 }
		  } 
		  printf("%d\n",dist[e]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lookqaq/article/details/80732524