Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22729 Accepted Submission(s):
5448
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define M 160 5 #define MAX 0x3f3f3f3f 6 using namespace std; 7 int m; 8 int map[M][M],vis[M],dis[M]; 9 char place[M][35]; 10 11 int find(char s[]) //关键处理,将字符串数组转换为整数数组存储 12 { 13 int i; 14 for(i=1; i<=m; i++) 15 { 16 if(strcmp(s,place[i])==0) 17 return i; 18 } 19 strcpy(place[++m],s); 20 return m; 21 } 22 23 int main() 24 { 25 int n,i,j,f,e; 26 char s[35]; 27 while(~scanf("%d",&n)) 28 { 29 if(n==-1) break; 30 m=0; 31 scanf("%s",s),f=find(s); 32 scanf("%s",s),e=find(s); 33 memset(vis,0,sizeof(vis)); 34 memset(dis,0,sizeof(dis)); 35 for(i=1; i<=150; i++) 36 for(j=1; j<=150; j++) 37 { 38 if(i==j) map[i][j]=0; 39 else map[i][j]=MAX; 40 } 41 int a,b,c; 42 while(n--) 43 { 44 scanf("%s",s),a=find(s); 45 scanf("%s",s),b=find(s); 46 scanf("%d",&c); 47 if(map[a][b]>c) 48 map[a][b]=c,map[b][a]=c; 49 } 50 vis[f]=1; 51 for(i=1; i<=m; i++) 52 dis[i]=map[f][i]; 53 int min,t; 54 for(i=1; i<=m; i++) 55 { 56 min=MAX; 57 for(j=1; j<=m; j++) 58 if(!vis[j]&&dis[j]<min) 59 { 60 min=dis[j]; 61 t=j; 62 } 63 vis[t]=1; 64 for(j=1; j<=m; j++) 65 if(!vis[j]&&map[t][j]<MAX) 66 if(dis[j]>dis[t]+map[t][j]) 67 dis[j]=dis[t]+map[t][j]; 68 } 69 if(dis[e]<MAX) 70 printf("%d\n",dis[e]); 71 else 72 printf("-1\n"); 73 } 74 return 0; 75 }
原文:http://www.cnblogs.com/pshw/p/5371472.html