题意:找两个城市之间的最短路,没有就输出-1;
简单题,把城市转成数字做就行,但有坑点:起点和终点可以相同;
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
int dis[200][200];
int n=190,m;
void dijkstra(){
int v[200] = {0};//标记有没走到过
while(1){
int mmin = INF,k;
for(int j = 1;j <= n;j++)//每次找距离最近且未走过的点
if(!v[j] && dis[1][j] < mmin)
k = j, mmin = dis[1][j];
if(mmin == INF) break;//找不到距离近且没走过的点了,退出
v[k] = 1;//标记
for(int j = 1;j <= n;j++)
dis[1][j] = min(dis[k][j]+dis[1][k],dis[1][j]);//不停的优化
}
if(dis[1][2] != INF) cout<<dis[1][2]<<endl;
else cout<<-1<<endl;
}
map <string,int>mp;//把城市映射成id,就是普通的最短路
string s1,s2,s3,s4;
int main()
{
while(cin>>m && m != -1){
mp.clear();
cin>>s3>>s4;
mp[s3] = 1,mp[s4] = 2;
for(int i = 0;i <= n;i++)
for(int j = 0;j <= n;j++)
dis[i][j] = (i==j?0:INF);
int a,b,c;
while(m--){
cin>>s1>>s2>>c;
if(mp[s1]) a = mp[s1];
else{
a = mp.size();
mp[s1] = a;
}
if(mp[s2]) b = mp[s2];
else{
b = mp.size();
mp[s2] = b;
}
dis[a][b] = dis[b][a] = min(dis[a][b],c);
}
if(s3 == s4){//注意!!!!起点终点可能相等
cout<<0<<endl;
continue;
}
dijkstra();
}
return 0;
}