题目很简单,只是多了对地名转化为数字的处理,好吧,这我也是参考网上的处理办法,不过大多数的人采用map来处理
注意初始化注意范围,不然会wa!!!(这是我当时wa的原因org)
大家容易忽视的地方——双向边,起点等于终点(虽然我当时都考虑到了)
#define _CRT_SECURE_NO_WARNINGS #include<string.h> #include<stdio.h> #include<math.h> const int MAXN=155; #define typec int const typec INF=0x3f3f3f3f;//防止后面溢出,这个不能太大 bool vis[MAXN]; int pre[MAXN]; typec cost[MAXN][MAXN]; typec lowcost[MAXN]; int nn; char mark[MAXN][33]; void Dijkstra(int n,int beg) { lowcost[beg]=0; for(int j=0;j<n;j++) { int k=-1; int Min=INF; for(int i=0;i<n;i++) if(!vis[i]&&lowcost[i]<Min) { Min=lowcost[i]; k=i; } if(k==-1)break; vis[k]=true; for(int i=0;i<n;i++) if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]) { lowcost[i]=lowcost[k]+cost[k][i]; pre[i]=k; } } } int find(char ch[])//灵感来自网上 { for(int i=0;i<nn;i++) { if(strcmp(mark[i],ch)==0) //有出现过 return i; } strcpy(mark[nn],ch);//出现新的记录一下 nn++; return nn-1; } int main() { int n,i,c,j,aa,bb,ee,ss; char a[33],b[33],s[33],e[33]; while(scanf("%d",&n)!=EOF) { if(n==-1)break; nn=0; for(i=0;i<MAXN;i++) { mark[i][0]='