题目很简单,只是多了对地名转化为数字的处理,好吧,这我也是参考网上的处理办法,不过大多数的人采用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]=‘\0‘; lowcost[i]=INF; vis[i]=false;pre[i]=-1; for(j=0;j<MAXN;j++) cost[i][j]=(i==j)? 0:INF; } scanf("%s%s",s,e); ss=find(s); ee=find(e); for(i=0;i<n;i++) { scanf("%s%s%d",a,b,&c); aa=find(a); bb=find(b); if(cost[aa][bb]>c) cost[aa][bb]=cost[bb][aa]=c; } Dijkstra(nn,ss); if(lowcost[ee]>=INF) lowcost[ee]=-1; if(strcmp(s,e)==0) printf("0\n"); else printf("%d\n",lowcost[ee]); } return 0; }
原文:http://www.cnblogs.com/laiba2004/p/3541631.html