http://acm.hdu.edu.cn/showproblem.php?pid=2112
字符串处理下,以前不会用find函数就自写了个 - -。。。
#include<stdio.h> #include<string.h> #define INF 0xfffffff #define N 600 int map[N][N],vis[N],dis[N],m,min; char name[N][32]; int find(char str[32]) { int i; for(i=1;i<=m;i++) { if(strcmp(name[i],str)==0) return i; } if(m==0||i>m) { m++; strcpy(name[m],str); return m; } } void dijkstra(int s,int e) { int i,j,k; memset(vis,0,sizeof(vis)); for(i=1;i<=m;i++) dis[i]=map[s][i]; vis[s]=1; dis[s]=0; for(i=1;i<=m-1;i++) { min=INF; for(j=1;j<=m;j++) if(!vis[j]&&dis[j]<min) { min=dis[j]; k=j; } if(min==INF) break; vis[k]=1; for(j=1;j<=m;j++) if(!vis[j]&&dis[j]>dis[k]+map[k][j]) dis[j]=dis[k]+map[k][j]; } if(dis[e]!=INF) printf("%d\n",dis[e]); else printf("-1\n"); } int main(void) { int T,i,j,a,b,c,s,e; char start[32],end[32],s1[32],s2[32]; while(scanf("%d",&T)!=EOF) { if(T==-1) break; m=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) map[i][j]=INF; scanf("%s %s",start,end); for(i=1;i<=T;i++) { scanf("%s %s %d",s1,s2,&c); a=find(s1); b=find(s2); if(map[a][b]>c) map[a][b]=map[b][a]=c; } s=find(start); e=find(end); if(s==e) printf("0\n"); else dijkstra(s,e); } return 0; }