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 虽然偶尔会迷路,但是因为有了你的帮助 **和**从此还是过上了幸福的生活。 ――全剧终――
这个题目和裸的最短路的题目差别在于地点给的不是数字而是字符串,我们这里应用STL中的map直接搞定:
#include <iostream> #include<stdio.h> #include<string.h> #include<map> #include<algorithm> using namespace std; #define N 0x1f1f1f1f int w[151][151]; int d[155]; char a[31],b[31]; int ans,vis[151]; void Dij() { int i,j,k,v,tmp; memset(vis,0,sizeof(vis)); for(i=1;i<ans;i++) d[i]=w[1][i]; d[1]=0; vis[1]=1; for(i=1;i<=ans;i++) { tmp=N; for(j=1;j<=ans;j++) { if(tmp>d[j]&&!vis[j]) { tmp=d[j]; v=j; } } vis[v]=1; for(k=1;k<=ans;k++) { if(!vis[k]) d[k]=min(d[k],d[v]+w[v][k]); } } } int main() { int i,j,c,test,k; map<string,int> s; while(scanf("%d",&test)&&test!=-1) { k=0,ans=3; s.clear();//初始化。 scanf("%s%s",a,b); if(!strcmp(a,b)) k=1; s[a]=1,s[b]=2; for(i=1;i<=150;i++) { for(j=1;j<=150;j++) if(i==j) w[i][j]=w[j][i]=0; else w[i][j]=w[j][i]=N; } while(test--) { scanf("%s%s%d",a,b,&c); if(!s[a]) s[a]=ans++; if(!s[b]) s[b]=ans++; w[s[a]][s[b]]=w[s[b]][s[a]]=min(w[s[a]][s[b]],c); } if(k==1) printf("0\n"); else { Dij(); if(d[2]<N) printf("%d\n",d[2]); else printf("-1\n"); } } return 0; }