Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19487 Accepted Submission(s): 4578
6 xiasha westlake xiasha station 60 xiasha ShoppingCenterofHangZhou 30 station westlake 20 ShoppingCenterofHangZhou supermarket 10 xiasha supermarket 50 supermarket westlake 10 -1
50 Hint: The best route is: xiasha->ShoppingCenterofHangZhou->supermarket->westlake 虽然偶尔会迷路,但是因为有了你的帮助 **和**从此还是过上了幸福的生活。 ――全剧终――
嗯,题目大意就是说,还是求两点间的最短路径,但是就是输入不太方便处理,这里我定义一个二维数组放进去,其他的都是一样的
//dijkstra #include <iostream> #include<cstdio> #include<cstring> #define inf 0x3f3f3f3f using namespace std; char s[150][30]; int cnt,map[150][150],rec[150],vis[150]; void dijkstra(int s,int e) { memset(vis,0,sizeof(vis)); vis[s]=1; for(int i=0;i<cnt;++i) rec[i]=map[s][i]; while(1) { int minw=inf,mark=-1; for(int i=0;i<cnt;++i) { if(!vis[i]&&rec[i]<minw) { minw=rec[i]; mark=i; } } if(mark==-1) break; vis[mark]=1; for(int i=0;i<cnt;++i) { if(!vis[i]&&rec[i]>rec[mark]+map[mark][i]) rec[i]=rec[mark]+map[mark][i]; } } if(rec[e]==inf) printf("-1\n"); else printf("%d\n",rec[e]); } int main() { int n,u,v,f; char a[30],b[30]; while(scanf("%d",&n)&&(n!=-1)) { memset(map,inf,sizeof(map)); scanf("%s%s",s[0],s[1]); cnt=2; while(n--) { scanf("%s%s%d",a,b,&f); for(int i=0;i<cnt;++i) { if(strcmp(a,s[i])==0) { u=i; break; } else if(i==cnt-1) { u=cnt; strcpy(s[cnt++],a); break; } } for(int i=0;i<cnt;++i) { if(strcmp(b,s[i])==0) { v=i; break; } else if(i==cnt-1) { v=cnt; strcpy(s[cnt++],b); } } map[u][v]=map[v][u]=f; } if(strcmp(s[0],s[1])==0) { printf("0\n"); continue; } dijkstra(0,1); } return 0; }
//floyed #include <iostream> #include<cstdio> #include<cstring> #define inf 0x3f3f3f3f using namespace std; char s[150][30]; int cnt,map[150][150]; void floyed() { for(int k=0;k<cnt;++k) { for(int i=0;i<cnt;++i) { for(int j=0;j<cnt;++j) { if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; } } } } int main() { int n,u,v,f; char a[30],b[30]; while(scanf("%d",&n)&&(n!=-1)) { memset(map,inf,sizeof(map)); scanf("%s%s",s[0],s[1]); cnt=2; while(n--) { scanf("%s%s%d",a,b,&f); for(int i=0;i<cnt;++i) { if(strcmp(a,s[i])==0) { u=i; break; } else if(i==cnt-1) { u=cnt; strcpy(s[cnt++],a); break; } } for(int i=0;i<cnt;++i) { if(strcmp(b,s[i])==0) { v=i; break; } else if(i==cnt-1) { v=cnt; strcpy(s[cnt++],b); } } map[u][v]=map[v][u]=f; } if(strcmp(s[0],s[1])==0) { printf("0\n"); continue; } floyed(); if(map[0][1]==inf) printf("-1\n"); else printf("%d\n",map[0][1]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 2112 HDU Today 【最短路径 dijkstra & floyed】
原文地址:http://blog.csdn.net/wyjwyl/article/details/47729841