http://acm.hdu.edu.cn/showproblem.php?pid=2112
怎样把具体的字母的地点转换为数字的函数为题目的重点。
HDU Today
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11385 Accepted Submission(s): 2663
Problem Description
经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。 这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。 徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗? 请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
Input
输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000); 第二行有徐总的所在地start,他的目的地end; 接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。 note:一组数据中地名数不会超过150个。 如果N==-1,表示输入结束。
Output
如果徐总能到达目的地,输出最短的时间;否则,输出“-1”。
Sample Input
6
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1
Sample Output
50
Hint:
The best route is: xiasha->ShoppingCenterofHangZhou->supermarket->westlake
虽然偶尔会迷路,但是因为有了你的帮助 **和**从此还是过上了幸福的生活。
――全剧终――
Author
lgx
Source
Recommend
lcy
这是我参考别人的代码过的:
1 #include<stdio.h> 2 #include<string.h> 3 #define maxint 0xfffffff 4 int map[160][160], visited[160], n, m, s, e; 5 long dis[160]; 6 char name[160][32]; 7 int find(char str[32]) 8 { 9 int i; 10 for(i = 1; i <= m; ++i){ 11 if(strcmp(name[i], str) == 0) 12 return i; 13 } 14 if(m == 0 || i > m){ 15 ++m; 16 strcpy(name[m], str); 17 return m; 18 } 19 }//函数的写法。 20 void dijkstra(int s, int e) 21 { 22 int i, j, mid; 23 for(i = 1; i <= m; i++) 24 { 25 dis[i] = map[s][i]; 26 visited[i] = i == s ? 1 : 0; 27 } 28 for(i = 1; i <= m - 1; i++) 29 { 30 mid = 0; 31 dis[mid] = maxint; 32 for(j = 1; j <= m; j++) 33 if(!visited[j] && dis[j] < dis[mid]) 34 mid = j; 35 visited[mid] = 1; 36 for(j = 1; j <= m; j++) 37 if(map[mid][j] < maxint && !visited[j] && map[mid][j] + dis[mid] < dis[j]) 38 dis[j] = map[mid][j] + dis[mid]; 39 } 40 } 41 int main() 42 { 43 int i, j, a, b, c; 44 char s1[40], s2[40], start[40], end[40]; 45 scanf("%d", &n); 46 while(n != -1) 47 { 48 m = 0; 49 for(i = 1; i <= 140; ++i){ 50 for(j = 1; j <= 140; j++) 51 map[i][j] = maxint; 52 } 53 scanf("%s %s", start, end); 54 for(i = 1; i <= n; i++) 55 { 56 scanf("%s %s %d", s1, s2, &c); 57 a = find(s1); 58 b = find(s2); 59 if(map[a][b] > c) 60 { 61 map[a][b] = c; 62 map[b][a] = c; 63 } 64 } 65 s = find(start); 66 e = find(end); 67 if(s == e) 68 printf("0 "); 69 else{ 70 dijkstra(s, e); 71 if(dis[e] != maxint) 72 printf("%ld ", dis[e]); 73 else 74 printf("-1 "); 75 } 76 scanf("%d", &n); 77 } 78 return 0; 79 }
但是我原先自己写的俩个算法怎么也过不了,我不知道是什么原因:要找出来。。。
1 #include<stdio.h> 2 #include<string.h> 3 #define Max 0xfffffff 4 int map[160][160],mark[160]; 5 int n,m,s,e; 6 long f[160]; 7 char name[160][32]; 8 int find(char str[30]) 9 { 10 int i; 11 for(i=1;i<=m;i++) 12 { 13 if(strcmp(name[i],str)==0) 14 return i; 15 } 16 if(m==0||i>m) 17 { 18 ++m; 19 strcpy(name[m],str); 20 21 return m; 22 } 23 } 24 int min(int x,int y) 25 { 26 return x>y?y:x; 27 } 28 void getmap() 29 { 30 int a,b,i,j,l; 31 char s1[40],s2[40]; 32 for(i=0;i<=140;i++) 33 for(j=0;j<=140;j++) 34 map[i][j]=(i==j?0:Max); 35 for(i=0;i<n;i++) 36 { 37 scanf("%s%s%d",&s1,&s2,&l); 38 a=find(s1); 39 b=find(s2); 40 map[a-1][b-1]=map[b-1][a-1]=min(map[a-1][b-1],l); 41 } 42 } 43 void dijkstra() 44 { 45 int i,j,k,min; 46 memset(mark,0,sizeof(mark)); 47 for(i=0;i<n;i++) 48 f[i]=map[s][i]; 49 f[s]=0; 50 for(i=0;i<n;i++) 51 { 52 min=Max; 53 for(j=0;j<n;j++) 54 { 55 if(!mark[j]&&min>f[j]) 56 { 57 k=j; 58 min=f[j]; 59 } 60 } 61 if(min==Max)break; 62 mark[k]=1; 63 for(j=0;j<n;j++) 64 if(!mark[j]&&f[j]>f[k]+map[k][j]) 65 f[j]=map[k][j]+f[k]; 66 } 67 if(f[e]!=Max) printf("%ld ",f[e]); 68 else printf("-1 "); 69 } 70 71 int main() 72 { 73 while(~scanf("%d",&n)&&n>0) 74 { 75 if(n==-1) 76 break; 77 char start[40],end[40]; 78 scanf("%s%s",start,end); 79 s=find(start)-1; 80 e=find(end)-1; 81 getmap(); 82 if(s==e) 83 printf("0 "); 84 else 85 dijkstra(); 86 87 } 88 return 0; 89 }
1 #include<stdio.h> 2 #include<string.h> 3 #define Max 0xfffffff 4 int n,m,s,e,map[160][160]; 5 char name[160][32]; 6 int find(char str[30]) 7 { 8 int i; 9 for(i=1;i<=m;i++) 10 { 11 if(strcmp(name[i],str)==0) 12 return i; 13 } 14 if(m==0||i>m) 15 { 16 ++m; 17 strcpy(name[m],str); 18 19 return m; 20 } 21 } 22 int min(int x,int y) 23 { 24 return x>y?y:x; 25 } 26 void getmap() 27 { 28 int a,b,i,j,l; 29 char s1[40],s2[40]; 30 for(i=0;i<n;i++) 31 for(j=0;j<n;j++) 32 map[i][j]=(i==j?0:Max); 33 for(i=0;i<n;i++) 34 { 35 scanf("%s%s%d",&s1,&s2,&l); 36 a=find(s1); 37 b=find(s2); 38 map[a-1][b-1]=map[b-1][a-1]=min(map[a-1][b-1],l); 39 } 40 } 41 void floyd(int s,int e) 42 { 43 int i,j,k; 44 for(k=0;k<n;k++) 45 for(i=0;i<n;i++) 46 for(j=0;j<n;j++) 47 map[i][j]=min(map[i][j],map[i][k]+map[k][j]); 48 printf("%d ",map[s][e]<Max?map[s][e]:-1); 49 50 } 51 int main() 52 { 53 while(~scanf("%d",&n)&&n>0) 54 { 55 if(n==-1) 56 break; 57 char start[40],end[40]; 58 scanf("%s%s",start,end); 59 s=find(start)-1; 60 e=find(end)-1; 61 getmap(); 62 floyd(s,e); 63 64 } 65 return 0; 66 }
再次重新做这个题目写的代码ac:
#include<stdio.h> #include<string.h> #define INF 0xfffffff int m,map[2600][2600],mark[2600]; int n,s,e; long f[2600]; char name[2600][32]; int find(char str[32]) { int i; for(i=0;i<m;i++) { if(strcmp(str,name[i])==0) return i; } if(m==0||i==m) { strcpy(name[i],str); m++; return i; } } void dijkstra() { int i,j,k,min; memset(mark,0,sizeof(mark)); for(i=0;i<n;i++) f[i]=map[s][i]; f[s]=0; for(i=0;i<m;i++) { min=INF; for(j=0;j<m;j++) { if(!mark[j]&&min>f[j]) { k=j; min=f[j]; } } if(min==INF)break; mark[k]=1; for(j=0;j<n;j++) if(!mark[j]&&f[j]>f[k]+map[k][j]) f[j]=map[k][j]+f[k]; } if(f[e]!=INF) printf("%ld ",f[e]); else printf("-1 "); } int main() { int i,j,x,y,time; while(~scanf("%d",&n)&&n!=-1) { m=0; char start[50],end[50],from[50],to[50]; scanf("%s%s",start,end); s=find(start); e=find(end); for(i=0;i<160;i++) for(j=0;j<160;j++) if(i==j) map[i][j]=map[j][i]=0; else map[i][j]=map[j][i]=INF; for(i=0;i<n;i++) { scanf("%s%s%d",from,to,&time); x=find(from); y=find(to); map[x][y]=map[y][x]=time; } if(s==e) printf("0 "); else dijkstra(); } return 0; }