代码:
#include <string>
#include <map>
#include <iostream>
using namespace std;
#define INF 0x3fffffff
#define MAXN 10017
#define M 32
int mat[MAXN][MAXN] ,n;
#define MAX 150
map<string,int>m;
void init()
{
for(int i = 0; i <= MAX; i++)
{
for(int j = 0; j <= MAX; j++)
{
if(i == j)
mat[i][j] = 0;
else
mat[i][j] = INF;
}
}
m.clear();
}
int dijkstra (int s,int f)
{
//s为起点, f:为终点
int dis[MAXN];//记录到任意点的最短距离
int mark[MAXN];//记录被选中的结点
int i,j,k = 0;
for(i = 0; i <= MAX; i++)
{
mark[i] = 0;//初始化所有结点,每个结点都没有被选中
dis[i] = INF;
}
mark[s] = 1;//start结点被选中
dis[s] = 0;//将start结点的的距离设置为0
int min ;//设置最短的距离。
for(i = 1; i <= MAX; i++)
{
k = 1;
min = INF;
for(j = 1; j <= MAX; j++)
{
if(mark[j] == 0 && dis[j] < min)//未被选中的结点中,距离最短的被选中
{
min = dis[j] ;
k = j;
}
}
mark[k] = 1;//标记为被选中
for(j = 1; j <= MAX; j++)
{
if( mark[j] == 0 && (dis[j] > (dis[k] + mat[k][j])))//修改剩余结点的最短距离
{
dis[j] = dis[k] + mat[k][j];
}
}
}
return dis[f];
}
int main()
{
int i;
char s[M], e[M], a[M], b[M];
int v;
while(~scanf("%d",&n))
{
init();
if(n == -1)
break;
scanf("%s%s",s,e);
m[s] = 1;
if(!m[e])
m[e] = 2;
int c = 3;
for(i = 0; i < n; i++)
{
scanf("%s%s%d",a,b,&v);
if(!m[a])
m[a] = c++;
if(!m[b])
m[b] = c++;
if(v < mat[m[a]][m[b]])
{
mat[m[a]][m[b]] = v;
mat[m[b]][m[a]] = v;
}
}
int ans = dijkstra(m[s],m[e]);
if(ans == INF)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}