认真读题,题中有很多坑,字符串处理能力有待提高。
#include<stdio.h> #include<string.h> #define inf 10000 int map[200][200],dis[200],used[200]; char s[200][50]; void dijkstra(int n){ int i,j,k,max; for(i=1;i<=n;i++){ dis[i]=map[1][i]; //printf("%d ",dis[i]); } dis[1]=0;used[1]=1; for(i=1;i<=n;i++){ max=inf; for(j=1;j<=n;j++){ if(!used[j]&&max>dis[j]){ max=dis[j]; k=j; } } used[k]=1; for(j=1;j<=n;j++) if(!used[j]&&dis[k]+map[k][j]<dis[j]){ dis[j]=dis[k]+map[k][j]; } } }//dijkstra算法 int main(){ int i,j,t,x,y,k,n; char a[50],b[50]; while(scanf("%d",&n),n!=-1){ memset(s,0,sizeof(s)); memset(dis,0,sizeof(dis)); memset(used,0,sizeof(used)); for(i=1;i<=150;i++) for(j=1;j<=150;j++){ map[i][j]=inf; } scanf("%s%s",s[1],s[2]); j=3; for(k=1;k<=n;k++){ scanf("%s%s%d",a,b,&t); for(i=1;i<=j;i++){ if(strcmp(a,s[i])==0) break; } if(i>j) { x=j; strcpy(s[j],a); j++; } else x=i; for(i=1;i<=j;i++){ if(strcmp(b,s[i])==0) break; } if(i>j) { y=j; strcpy(s[j],b); j++; } else y=i; if(map[x][y]>t){ map[x][y]=map[y][x]=t;//重边 } } if(strcmp(s[1],s[2])==0) printf("0\n");//起点与终点相同 else{ dijkstra(j); if(dis[2]!=inf) printf("%d\n",dis[2]); else printf("-1\n"); } } return 0; }