#include <iostream>
#include <map>
#include <string>
#include <cstring>
#include <cstdio>
#define INF 0x3f3f3f3f
#define MAXN 155
using namespace std;
map<string,int>m;
int mp[MAXN][MAXN],dist[MAXN],visited[MAXN];
void init()//初始化
{
for(int i=1;i<MAXN;i++)
{
for(int j=1;j<MAXN;j++)
mp[i][j]=INF;
}
}
void Dijkstra(int s,int n)
{
int min,u;
for (int i=1;i<=n;i++)
{
dist[i]=mp[s][i];
visited[i]=0;
}
dist[s]=0;
visited[0]=1;
for (int i=1;i<=n;i++)
{
min=INF;
u=1;
for (int j=1;j<=n;j++)
{
if (!visited[j]&&dist[j]<min)
{
min=dist[j];
u=j;
}
}
if(min==INF)
break;
visited[u]=1;
for (int j=1;j<=n;j++)
{
if(!visited[j]&&dist[j]>(dist[u]+mp[u][j]))
dist[j]=dist[u]+mp[u][j];
}
}
}
int main()
{
int n,k,len,flag;
char s[32],e[32];
while(scanf("%d",&n)&&n!=-1)
{
flag=0;
k=1;
m.clear();
init();
scanf("%s%s",s,e);
if(strcmp(s,e)==0)//注意输入的起点和终点一样
flag=1;
m[s]=k++;//起点为1
m[e]=k++;//终点为2
for(int i=1;i<=n;i++)
{
scanf("%s%s%d",s,e,&len);
if(!m[s])
m[s]=k++;
if(!m[e])
m[e]=k++;
if (len<mp[m[s]][m[e]])
{
mp[m[s]][m[e]]=len;
mp[m[e]][m[s]]=len;
}
}
if(flag==1)
{
printf("0\n");
continue;
}
Dijkstra(1,k);
if(dist[2]==INF)
printf("-1\n");
else
printf("%d\n",dist[2]);
}
return 0;
}
hdu2112 HDU Today (Dijkstra)
最新推荐文章于 2019-10-16 21:56:02 发布