hdu 2066一个人的旅行 Dijkstra算法应用

Problem Description
虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
 

 

Input
输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
 

 

Output
输出草儿能去某个喜欢的城市的最短时间。
 

 

Sample Input
   
   
   
   
6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
 

 

Sample Output
   
   
   
   
9
 这一题让我纠结很久,自己写的代码运行结果对,可是提交上去既Runtime Error,看了别人的代码,也不知道自己哪错了,下面就膜拜一下吧
#include<stdio.h> #define N 1100 #define max 999999 int g[N][N],S[N],D[N]; int dijkstra(int s,int n) { int i,j,u,min,dis[N],mark[N]; for(i=0;i<n;i++) { mark[i]=0; dis[i]=g[s][i]; } mark[s]=1; dis[s]=0; for(i=1;i<n;i++) { min=max; for(j=0;j<n;j++) if(!mark[j]&&min>dis[j]) { u=j; min=dis[j]; } mark[u]=1; for(j=0;j<n;j++) if(!mark[j]&&g[u][j]!=max&&dis[j]>dis[u]+g[u][j]) dis[j]=dis[u]+g[u][j]; } min=max; for(i=0;i<n;i++) if(D[i]) if(min>dis[D[i]]) min=dis[D[i]]; return min; } int main() { int i,j,t,s,d,x,y,dis,n; while(scanf("%d%d%d",&t,&s,&d)!=EOF) { for(i=0;i<N;i++) { S[i]=0;D[i]=0; for(j=0;j<N;j++) g[i][j]=max; } n=0; while(t--) { scanf("%d%d%d",&x,&y,&dis); if(g[x-1][y-1]>dis) g[x-1][y-1]=g[y-1][x-1]=dis; if(n<x) n=x; if(n<y) n=y; } for(i=0;i<s;i++) { scanf("%d",&S[i]); S[i]--; } for(i=0;i<d;i++) { scanf("%d",&D[i]); D[i]--; } dis=max; for(i=0;i<s;i++) { y=dijkstra(S[i],n); //printf("%d,%d distance is %d/n",S[i],D[j],y); if(dis>y) dis=y; } printf("%d/n",dis); } return 0; }

你可能感兴趣的:(hdu 2066一个人的旅行 Dijkstra算法应用)