https://vjudge.net/contest/270244#problem/U
最短路算法,用map函数储存字符串,标号为数字;
注意判断重复点,重复点不需要标号;
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int d[155][155];//储存原始长度
int dis[155];//储存始点到i点距离
int visit[155];//标记
int m;
char x[35],y[35];//用于输入的字符串
int t;
map<string,int>mp;
void init()
{
mp.clear();
getchar();
cin>>x>>y;
mp[x]=1;
t=2;
while(!mp[y])
{
mp[y]=t++;
}
memset(d,INF,sizeof(d));
memset(visit,0,sizeof(visit));
char a[30],b[30];
int c;
for(int i=1; i<=m; i++)
{
getchar();
cin>>a>>b>>c;
if(!mp[a])
{
mp[a]=t++;
}
if(!mp[b])
{
mp[b]=t++;//编号;
}
//防止有重复编号的点;
if(d[mp[a]][mp[b]]>=c)
{
d[mp[b]][mp[a]]=d[mp[a]][mp[b]]=c;//处理有重复边
}
for(int i=1; i<t; i++)
{
dis[i]=d[1][i];
}
visit[1]=1;
dis[1]=0;
}
}
void dijkstra()
{
int mins,k;
for(int i=1; i<t; i++)
{
mins=INF;
for(int j=1; j<t; j++)
{
if(!visit[j]&&dis[j]<mins)
{
k=j;
mins=dis[j];
}
}//找到与之相邻的最短距离点;
if(mins==INF)break;
visit[k]=1;
for(int j=1; j<t; j++)
{
if(!visit[j]&&dis[j]>dis[k]+d[k][j])
{
dis[j]=dis[k]+d[k][j];
}
}
}
}
int main()
{
while(scanf("%d",&m)&&(m!=-1))
{
init();
dijkstra();
if(dis[mp[y]]==INF)//刚开始没有考虑起点和终点重合,一定要记住有可能重合
printf("-1\n");
else
printf("%d\n",dis[mp[y]]);
}
return 0;
}