题目链接:acm.hdu.edu.cn/showproblem.php?pid=2112
分析:只要将字符串映射成数字,就可以用Dijkstra算法!
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<map>
using namespace std;
const int maxn=10000+5;
const int inf=1000000;
int f[155][155];
int dis[155];
bool vis[155];
int dijkstra( int t ){
for(int i=1;i<t;++i)
dis[i]=f[i][1],vis[i]=false;
vis[1]=true;
for(int j=1;j<t;++j){
int min=inf,mj=-1;
for(int i=1;i<t;++i)
if(!vis[i]&&dis[i]<min)min=dis[i],mj=i;
vis[mj]=true;
if(mj==-1)break;
for(int i=1;i<t;++i)
if(dis[i]>f[i][mj]+dis[mj]&&!vis[i])
dis[i]=f[i][mj]+dis[mj];
}
if(dis[2]==inf)dis[2]=-1;
return dis[2];
}
int main(){
int n;
while(~scanf("%d",&n),n!=-1){
for(int i=1;i<152;++i)
for(int j=1;j<152;++j)
if(i==j)f[i][j]=0;
else f[i][j]=f[j][i]=inf;
map<string,int>M;
int t=3;
string a,b; cin>>a>>b;
int q=0;
if(a==b)q=1;
M[a]=1; M[b]=2;
while(n--){
int x; cin>>a>>b>>x;
if(!M[a])M[a]=t++;
if(!M[b])M[b]=t++;
if(x<f[M[a]][M[b]])
f[M[a]][M[b]]=f[M[b]][M[a]]=x;
}
if(q){
cout<<0<<endl;
continue;
}
cout<<dijkstra(t)<<endl;
}
return 0;
}