# include<stdio.h> # include<string.h> # include<algorithm> using namespace std; const int maxn = 160; const int INF = 9999; int N, M, S, T, t; long d[maxn]; 点到起点的距离 int map[maxn][maxn];点到点的距离 int vis[maxn];该点是否被访问 char s1[33], s2[33];存起始和终点站 char d1[33], d2[33];存读取的两站点 char vs[160][33];存已知的站点 void dijkstra(void) { int i, id; for(i=0; i<t; i++) { d[i]=map[S][i]; //初始化d[i], 表示起点到i的时间 } d[S]=0; memset(vis, 0, sizeof(vis)); //初始化vis vis[S]=1; while(1) { int mins = INF; id = -1; for(i=0; i<t; i++) //找到离起点最近的那个点 { if(vis[i]==0 && mins>d[i]) { mins=d[i]; id=i; } } if(mins==INF) //如果找不到就直接跳出 break; vis[id]=1; //标记该被访问 for(i=0; i<t; i++) { if(vis[i]==1) continue; d[i]=min(d[i], d[id]+map[id][i]);//如果d[id]+map[id][i]<d[i]那么更新d[i] } } if(d[T]!=INF) printf("%d\n", d[T]); else printf("-1\n"); } int main(void) { int i, j, A, B, X, temp, flag; while(scanf("%d", &N)!=EOF){ if(N==-1) break; flag=0; for(i=0; i<150; i++) for(j=0; j<150; j++) map[i][j]=INF; //初始化 scanf("%s%s", s1, s2); if(strcmp(s1, s2)==0) //如果起始和终点相同,flag置为1 { flag=1; } memcpy(vs[0], s1, sizeof(s1));//将起始站放入 vs数组 memcpy(vs[1], s2, sizeof(s2));//将终点站放入 vs数组 t=2;//vs数组接下来从下标为2开始存 S=0;//起始站 vs下标为0 T=1;//终点站 vs下标为1 for(i=0; i<N; i++) { scanf("%s%s%d", &d1, &d2, &X); //读取d1站,d2站, d1 d2的时间 temp=1; for(j=0; j<t; j++) { if(strcmp(vs[j], d1)==0) //如果d1在vs里 { temp=0; A=j; //那么记录A=j break; } } if(temp) //如果d1不在vs里,将d1存入vs { memcpy(vs[t], d1, sizeof(d1)); A=t; //记录A=t t++; } temp=1; for(j=0; j<t; j++) { if(strcmp(vs[j], d2)==0) //如果d2不在vs里,将d2存入vs { temp=0; B = j; //记录B=j break; } } if(temp)//否则将d2存入vs { memcpy(vs[t], d2, sizeof(d2)); B=t; //记录B=t t++; } if(map[A][B]>X) //如果X小于当前map[A][B]的值,更新map[A][b]=X map[A][B]=map[B][A]=X; } if(flag==1) //如果起点和终点相同,直接输出0 printf("0\n"); else //否则就进入dijkstra dijkstra(); } return 0; }
HDU2112
最新推荐文章于 2021-04-12 07:44:35 发布