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 虽然偶尔会迷路,但是因为有了你的帮助 **和**从此还是过上了幸福的生活。 ――全剧终――
此题上来一看,N最大可以取到10000,数据较强,不能用Floyd算法了(小编TT),既然如此,这里我们采取dijkstra算法。其他的在输入输出问题上可以采取用map映射的方法,由于小编在做的时候忘记了,这里在输入上直接用的暴力的方法解决,在这里也算是给不会用STL map的读者一点福利啦(好吧,小编我承认是懒得改……)。
#include <cstdio> #include <cstring> #define INF 0xfffffff #define maxn 150+5 int map[maxn][maxn],dist[maxn],vis[maxn],k; char s[maxn][40],s1[40],s2[40]; void init() { for(int i=1; i<maxn; i++) for(int j=1; j<maxn; j++) if(i == j) map[i][j] = 0; else map[i][j] = INF; } int dijkstra(int u,int v) { memset(vis,0,sizeof(vis)); for(int i=1; i<=k; i++) dist[i] = map[u][i]; dist[u] = 0; for(int i=1; i<k; i++) { int pos,min; pos = u,min = INF; for(int j=1; j<=k; j++) if(!vis[j] && dist[j]<min) { pos = j; min = dist[j]; } vis[pos] = 1; for(int j=1; j<=k; j++) { if(!vis[j] && dist[j]>dist[pos]+map[pos][j]) dist[j] = dist[pos]+map[pos][j]; } } return dist[v]==INF? -1:dist[v]; } int main() { int n; while(scanf("%d",&n)&&n!=-1) { int flag; k = 2; init(); scanf("%s%s",s+1,s+2); int a,b,c; while(n--) { scanf("%s%s%d",s1,s2,&c); flag = 0; for(int i=1;i<=k;i++) if(strcmp(s1,s[i])==0) {a=i,flag=1;break;} if(!flag) strcpy(s[++k],s1),a=k; flag=0; for(int i=1;i<=k;i++) if(strcmp(s2,s[i])==0) {b=i;flag=1;break;} if(!flag) strcpy(s[++k],s2),b=k; if(map[a][b] > c) map[a][b] = map[b][a] = c; } if(strcmp(s[1],s[2]) == 0) printf("0\n"); else printf("%d\n",dijkstra(1,2)); } return 0; }