本来是拿来复习一下map的,没想搞了半天,一直wa,最后发现预处理没有处理到所有的点
就是个最短路
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 虽然偶尔会迷路,但是因为有了你的帮助 **和**从此还是过上了幸福的生活。 ――全剧终――
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 const int maxint=9999999; 9 //printf("----\n"); 10 using namespace std; 11 int m,t; 12 int tot=0; 13 map<string,int> st; 14 int c[200][200],dist[200]; 15 void dijkstra(int u,int n) 16 { 17 //printf("%d\n",n); 18 bool vis[200]; 19 for(int i=1;i<=n;i++) 20 { 21 vis[i]=0; 22 dist[i]=c[u][i]; 23 } 24 vis[u]=1; 25 for(int i=2;i<=n;i++) 26 { 27 int temp=maxint; 28 int k=u; 29 for(int j=1;j<=n;j++) 30 { 31 if(!vis[j]&&dist[j]<temp) 32 { 33 temp=dist[j]; 34 k=j; 35 } 36 } 37 if(temp==maxint) break; 38 vis[k]=1; 39 for(int j=1;j<=n;j++) 40 { 41 if(!vis[j]&&c[k][j]<maxint) 42 { 43 if(dist[k]+c[k][j]<dist[j]) 44 dist[j]=dist[k]+c[k][j]; 45 } 46 } 47 } 48 } 49 int main() 50 { 51 int i,j,k,n; 52 //freopen("1.in","r",stdin); 53 while(scanf("%d",&n)!=EOF) 54 { 55 bool flag=0; 56 if(n==-1) break; 57 st.clear(); 58 char s[30],e[30]; 59 scanf("%s%s",s,e); 60 if(strcmp(s,e)==0) 61 { 62 flag=1; 63 } 64 st[s]=1; 65 st[e]=2; 66 tot=3; 67 for(i=1;i<=150;i++) 68 { 69 for(j=1;j<=150;j++) c[i][j]=c[j][i]=((i==j)?0:maxint); 70 } 71 for(i=1;i<=150;i++) 72 { 73 dist[i]=maxint; 74 } 75 for(i=1;i<=n;i++) 76 { 77 int w; 78 scanf("%s%s%d",s,e,&w); 79 if(!st[s]) st[s]=tot++; 80 if(!st[e]) st[e]=tot++; 81 c[st[s]][st[e]]=c[st[e]][st[s]]=w; 82 } 83 dijkstra(1,tot); 84 if(flag) printf("0\n"); 85 else if(dist[2]==maxint) printf("-1\n"); 86 else 87 printf("%d\n",dist[2]); 88 } 89 return 0; 90 }
时间: 2024-10-14 01:32:22