给定一波站点,求其中两个站点的最短路径。
Map映射,floyd求最短路。注意map<string,int>ss这句话的存在使得要添加string的头文件。
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <iostream>
using namespace std;
const int inf = 1<<20 ;
int way[155][155] ;
char s[40] , e[40] ;
char s1[40] , s2[40] ;
int n , all ;
map <string , int> ss ;
void init() {
ss.clear();
for(int i=1;i<=150;i++){
for(int j=i+1;j<=150;j++){
way[i][j]=way[j][i]=inf;
}
}
}
void floyd() {
for(int k=1;k<=all;k++){
for(int i=1;i<=all;i++){
if(way[i][k]==inf) continue;
for(int j=1;j<=all;j++){
if(i!=j && i!=k && j!=k && way[i][j]>way[i][k]+way[k][j]){
way[i][j]=way[i][k]+way[k][j];
}
}
}
}
}
int main() {
//freopen("in.txt","r",stdin);
while(cin >> n) {
if(n==-1) break;
init();
scanf("%s %s",s,e);
ss[s]=1 ;
int i=2;
while(n--){
int d;
scanf("%s %s %d",s1,s2,&d);
if(!ss[s1]) ss[s1]=i++;
if(!ss[s2]) ss[s2]=i++;
way[ss[s1]][ss[s2]]=way[ss[s2]][ss[s1]]=d;
}
if(!ss[e]) {
cout << -1 << endl ;
continue;
}
all=i-1;
int nn=ss[e];
floyd();
if(way[1][nn]==inf) cout << -1 << endl;
else cout << way[1][nn] << endl;
}
return 0;
}