题解:因为读入的是字符串,所以用map储存数据,然后就是dijkstra模板;
#include<string>
#include<string.h>
#include<iterator>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
map<string,int>mybus;
#define maxn 1000000
#define SIZE 160
int vis[SIZE];
int len[SIZE];
int dis[SIZE][SIZE];
void dijkstra(int x,int y,int n)
{
for(int i=1;i<=n;i++)
{
len[i]=dis[x][i];
vis[i]=0;
}
vis[x]=1;
len[x]=0;
int u;
for(int i=2;i<=n;i++)
{
int minx=maxn;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&len[j]<minx)
{
minx=len[j];
u=j;
}
}
vis[u]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&len[j]>len[u]+dis[u][j])
len[j]=len[u]+dis[u][j];
}
}
if(len[y]==maxn)
cout<<"-1"<<endl;
else
cout<<len[y]<<endl;
}
int main()
{
int n;
while(1)
{
cin>>n;
if(n==-1)
break;
mybus.clear();
char st[40],de[40];
cin>>st>>de;
int cnt=0;
if(!mybus[st])
{
cnt++;
mybus[st]=cnt;
}
if(!mybus[de])
{
cnt++;
mybus[de]=cnt;
}
for(int i=0;i<SIZE;i++)
{
for(int j=0;j<SIZE;j++)
{
dis[i][j]=maxn;
}
dis[i][i]=0;
}
char be[40],ed[40];
int l;
for(int i=1;i<=n;i++)
{
cin>>be>>ed;
if(!mybus[be])
{
cnt++;
mybus[be]=cnt;
}
if(!mybus[ed])
{
cnt++;
mybus[ed]=cnt;
}
cin>>l;
dis[mybus[be]][mybus[ed]]=dis[mybus[ed]][mybus[be]]=l;
}
if(strcmp(st,de)==0)
cout<<"0"<<endl;
else
dijkstra(mybus[st],mybus[de],mybus.size());
}
return 0;
}