题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112
解题思路:唯一麻烦的就是地点全部是字符串,解决办法就是用map把字符串映射成int型再用迪杰斯特拉算法去处理就行,注意一下,最后要特判起点等于终点的时候要把dist值改为0,因为开始会把起点终点映射成两个int值,所以会导致起点和终点是一个点的时候出错。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f
#define N 105
int val[N][N];
int dist[N],vis[N];
unordered_map<string,int>num;
int n,s,e,ans;
inline void Dijkstra(){
for(int i=0;i<ans;i++){
dist[i]=val[s][i];
vis[i]=0;
}
dist[s]=0;
vis[s]=1;
for(int i=1;i<ans;i++){
int minn=inf;
int a=-1;
for(int j=0;j<ans;j++){
if(!vis[j]&&minn>dist[j]){
minn=dist[j];
a=j;
}
}
if(a==-1)return;
vis[a]=1;
for(int j=0;j<ans;j++){
if(!vis[j]&&val[a][j]!=inf){
if(dist[j]>dist[a]+val[a][j]){
dist[j]=dist[a]+val[a][j];
}
}
}
}
}
int main(){
ios::sync_with_stdio(false);
while(cin>>n){
if(n==-1)break;
string start,end;
num.clear();//初始化map
cin>>start>>end;
num[start]=s=0;//映射
num[end]=e=1;
ans=2;
for(int i=0;i<105;i++){
for(int j=0;j<105;j++){
if(i!=j)val[i][j]=inf;
else val[i][j]=0;
}
}
for(int i=0;i<n;i++){
string a,b;
int c;
cin>>a>>b>>c;
int aa,bb;
if(num.find(a)==num.end()){//用map把string映射成int
num[a]=aa=ans++;
}else{
aa=num[a];
}
if(num.find(b)==num.end()){
num[b]=bb=ans++;
}else{
bb=num[b];
}
val[aa][bb]=val[bb][aa]=c>val[aa][bb]?val[aa][bb]:c;
}
Dijkstra();
if(start==end)dist[1]=0;//避免因为map映射导致的答案错误
cout<<(dist[1]==inf?-1:dist[1])<<endl;
}
return 0;
}