认真读题,题中有很多坑,字符串处理能力有待提高。
#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;
}