Input
输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000);
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
Output
如果徐总能到达目的地,输出最短的时间;否则,输出“-1”。
这个题输入的站名都是字符串,所以多一步对字符串的处理,但是要注意起点和终点可能相同的情况
#include<stdio.h>
#include<limits.h>
#include<string.h>
int a[210][210],dis[210],vis[210];
char s[210][35];
void dijkstra(int n)
{
int i,j,pos,min;
memset(vis,0,sizeof(vis));
pos=1;
vis[1]=1;
dis[1]=0;
for(i=2;i<=n;i++)
dis[i]=a[1][i];
for(i=1;i<n;i++){
min=INT_MAX;
for(j=2;j<=n;j++)
if(!vis[j]&&dis[j]<min){
min=dis[j];
pos=j;
}
vis[pos]=1;
for(j=2;j<=n;j++)
if(!vis[j]&&a[pos][j]!=INT_MAX&&dis[pos]+a[pos][j]<dis[j])
dis[j]=dis[pos]+a[pos][j];
}
}
int main()
{
int n,i,j,t,c;
char s1[35],s2[35];
while(scanf("%d",&n)!=EOF){
if(n==-1)
break;
for(i=1;i<=200;i++){
dis[i]=INT_MAX;
for(j=1;j<=200;j++)
a[i][j]=INT_MAX;
}
scanf("%s%s",s[1],s[2]);
t=3;
while(n--){
scanf("%s%s%d",s1,s2,&c);
for(i=1;i<t;i++)
if(strcmp(s1,s[i])==0)
break;
if(i==t)
strcpy(s[t++],s1);
for(j=1;j<t;j++)
if(strcmp(s2,s[j])==0)
break;
if(j==t)
strcpy(s[t++],s2);
if(c<a[i][j]) //判断重复边
a[i][j]=a[j][i]=c;
}
if(strcmp(s[1],s[2])==0){ //起点与终点相同时,所需时间为0
printf("0\n");
continue;
}
dijkstra(t-1);
if(dis[2]==INT_MAX)
printf("-1\n");
else
printf("%d\n",dis[2]);
}
return 0;
}