#include <stdio.h>
#include <string.h>
#define INF 1e7
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
int n,i,j,k,t,u,a,b,used[200],cost[200][200],d[200];
char s[50],e[50],f[200][50];
while(scanf("%d",&n)){
if(n==-1)break;
scanf("%s%s",s,e);
int flag=0;
memset(f,0,sizeof(int)*200);
for(i=0;i<=150;i++){
for(j=0;j<=150;j++){
cost[i][j]=cost[j][i]=INF;
}
}
strcpy(f[0],s);
strcpy(f[1],e);
/*if(strcmp(s,e)==0){
printf("0\n");
continue;
}*/
k=2;
for(i=0;i<=n-1;i++){
scanf("%s%s%d",s,e,&t);
for(j=0;j<=k-1;j++){
if(strcmp(s,f[j])==0){
flag=1;
a=j;
}
}
if(flag==0)a=k++;
strcpy(f[a],s);
flag=0;
for(j=0;j<=k-1;j++){
if(strcmp(e,f[j])==0){
flag=1;
b=j;
// printf("lllllllllll\n");
}
}
if(flag==0)b=k++;
strcpy(f[b],e);
flag=0;
if(t<cost[a][b])cost[a][b]=cost[b][a]=t;
//printf("%d,%d,%d,\n",a,b,t);
}
//·Ö¸îÏß
for(i=0;i<=k-1;i++){
d[i]=INF;
}
memset(used,0,sizeof(int)*k);
d[0]=0;
while(1){
int v=-1;
for(u=0;u<=k-1;u++){
if(!used[u]&&(v==-1||d[u]<d[v]))v=u;
}
if(v==-1)break;
used[v]=1;
for(u=0;u<=k-1;u++){
d[u]=min(d[u],d[v]+cost[v][u]);
}
}
if(strcmp(f[0],f[1])==0){
printf("0\n");
continue;
}
if(d[1]!=INF)printf("%d\n",d[1]);
else printf("-1\n");
}
return 0;
}
最短路问题
主要问题是将地名和数字对应起来
每输入一次s,e,t都进行一次处理,对于s,e分别寻找之前是否已储存过这个地名,如果没有,就为新地名取一个对应的数字,如果有,就记录下这个地名对应的数字,处理完后用cost数组储存两地的距离
迪杰斯特拉算法之前的题解里已经说过了