这道题先用map将字符串映射到int上,之后与常见的dijkstra算法相同。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <map>
#define N 155
#define inf 1000000
using namespace std;
int n,t,mp[N][N],num[N];
bool vis[N];
int tt;
map<string,int> m;
void init()
{
m.clear();
for(int i=1;i<=N;i++)
{
vis[i]=false;
num[i]=inf;
for(int j=1;j<=N;j++)
{
mp[i][j]=inf;
}
}
}
bool dijkstra()
{
num[1]=0;
int next,MIN;
for(int i=1;i<=tt;i++)
{
MIN=inf;
for(int j=1;j<=tt;j++)
{
if(!vis[j] && num[j]<MIN)
{
MIN=num[next=j];
}
}
if(MIN==inf) break;
if(next==2) return true;
vis[next]=true;
for(int j=1;j<=tt;j++)
{
if(mp[j][next]==inf) continue;
if(!vis[j] && num[j]>num[next]+mp[j][next])
{
num[j]=num[next]+mp[j][next];
}
}
}
return false;
}
int main()
{
char c1[35],c2[35];
while(scanf("%d",&n)==1 && n!=-1)
{
init();
tt=0;
scanf("%s %s",c1,c2);
if(!m[c1]) m[c1]=++tt;
if(!m[c2]) m[c2]=++tt;
bool ok=false;
if(tt==1) ok=true;
for(int i=0;i<n;i++)
{
scanf("%s %s %d",c1,c2,&t);
if(!m[c1]) m[c1]=++tt;
if(!m[c2]) m[c2]=++tt;
int a=m[c1],b=m[c2];
if(mp[a][b]>t)
mp[a][b]=mp[b][a]=t;
}
tt++;
if(ok) printf("0\n");
else if(!dijkstra()) printf("-1\n");
else printf("%d\n",num[2]);
}
return 0;
}