HDOJ 2066 floyed优化算法
一个人的旅行
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15657 Accepted Submission(s): 5350
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
Author
Grass
优化前:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> #define inf 0xffffff int max_city; int g[1001][1001]; void floyed(int n) { int i,j,k; for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { //if(g[i][k]!=inf)//优化floyed for(j=1;j<=n;j++) { if(g[i][k]+g[k][j]<g[i][j]) g[j][i]=g[i][j]=g[i][k]+g[k][j]; } } } } int main() { int t,s,d,i,j; int st[1001],end; while(scanf("%d %d %d",&t,&s,&d)!=EOF) { max_city=-1; for(i=1;i<=1000;i++) { for(j=1;j<=1000;j++) g[i][j]=inf; g[i][i]=0; } int a,b,time; for(i=1;i<=t;i++) { scanf("%d %d %d",&a,&b,&time); if(a>max_city) max_city=a; if(b>max_city) max_city=b; if(g[a][b]>time) g[a][b]=g[b][a]=time; } for(i=1;i<=s;i++) scanf("%d",&st[i]); floyed(max_city); int min=inf; for(i=1;i<=d;i++) { scanf("%d",&end); for(j=1;j<=s;j++) if(g[st[j]][end]<min) min=g[st[j]][end]; } printf("%d\n",min); } return 0; }
优化后:
9891653 | 2013-12-25 17:27:21 | Accepted | 2066 | 187MS | 4152K | 992 B | G++ | 泽泽 |
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #define inf 0xffffff 4 int max_city; 5 int g[1001][1001]; 6 void floyed(int n) 7 { 8 int i,j,k; 9 for(k=1;k<=n;k++) 10 { 11 for(i=1;i<=n;i++) 12 { 13 if(g[i][k]!=inf)//优化floyed 14 for(j=1;j<=n;j++) 15 { 16 if(g[i][k]+g[k][j]<g[i][j]) 17 g[j][i]=g[i][j]=g[i][k]+g[k][j]; 18 } 19 } 20 } 21 } 22 int main() 23 { 24 int t,s,d,i,j; 25 int st[1001],end; 26 while(scanf("%d %d %d",&t,&s,&d)!=EOF) 27 { 28 max_city=-1; 29 for(i=1;i<=1000;i++) 30 { 31 for(j=1;j<=1000;j++) 32 g[i][j]=inf; 33 g[i][i]=0; 34 } 35 int a,b,time; 36 for(i=1;i<=t;i++) 37 { 38 scanf("%d %d %d",&a,&b,&time); 39 if(a>max_city) 40 max_city=a; 41 if(b>max_city) 42 max_city=b; 43 if(g[a][b]>time) 44 g[a][b]=g[b][a]=time; 45 46 } 47 for(i=1;i<=s;i++) 48 scanf("%d",&st[i]); 49 floyed(max_city); 50 int min=inf; 51 for(i=1;i<=d;i++) 52 { 53 scanf("%d",&end); 54 for(j=1;j<=s;j++) 55 if(g[st[j]][end]<min) 56 min=g[st[j]][end]; 57 } 58 printf("%d\n",min); 59 } 60 return 0; 61 }