最短路径问题,城市名字可用map标记一下
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
using namespace std;
map<string,int> m;
int a[155][155];
int vis[155],dis[155],N;
string s,e;
int dij(int n){
int ss=m[s];
vis[ss]=1;
int next=0;
for(int i=1;i<=n;i++){
if(a[ss][i]!=999999){
dis[i]=a[ss][i];
// cout<<dis[i]<<endl;
}
}
for(int i=1;i<n;i++){
int minn=999999;
int flag=0;
for(int i=1;i<=n;i++){
if(minn>dis[i]&&!vis[i]){
minn=dis[i];
next=i;
flag=1;
}
}
vis[next]=1;
if(next==m[e]){
break;
}
if(!flag){
break;
}
// cout<<next<<' '<<dis[next]<<endl;
for(int i=1;i<=n;i++){
if(dis[i]>a[next][i]+dis[next]){
dis[i]=a[next][i]+dis[next];
}
}
}
return 0;
}
int main(){
string city,city2;
while(scanf("%d",&N)!=EOF&&(N!=-1)){
cin>>s>>e;
getchar();
int temp=1,t;
m.clear();
memset(vis,0,sizeof(vis));
for(int i=0;i<155;i++){
dis[i]=999999;
for(int j=0;j<155;j++){
a[i][j]=999999;
}
}
while(N--){
cin>>city>>city2>>t;
if(m[city]==0){
m[city]=temp++;
}
if(m[city2]==0){
m[city2]=temp++;
}
a[m[city]][m[city2]]=a[m[city2]][m[city]]=t;
}
if(s==e){
printf("0\n");
continue;
}
dij(temp);
if(dis[m[e]]==999999){
printf("-1\n");
}
else{
printf("%d\n",dis[m[e]]);
}
}
return 0;
}