题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112
解题思路:还是求解最小路径,主要增加了map,使地名和编号对应起来。
我写的是用了dijkstra +map 求解的
ac代码:
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>
#include<iostream>
#define maxn 155
#define inf 0x3f3f3f3f
using namespace std;
int n;
int len[maxn][maxn],dis[maxn];
bool mark[maxn];
void dijkstra(int start,int end)
{
int k,tmp;
memset(mark,0,sizeof(mark));
for(int i=start;i<=end;i++)
dis[i]=(i==start?0:inf);
for(int i=start;i<=end;i++)
{
tmp=inf;
int u;
for(int j=start;j<=end;j++)
{
if(!mark[j]&&dis[j]<tmp)
{
tmp=dis[j];
u=j;
}
}
mark[u]=1;
if(tmp==inf) break;
for(int j=start;j<=end;j++)
if(dis[j]>dis[u]+len[u][j])
dis[j]=dis[u]+len[u][j];
}
}
int main()
{
map<string,int>lu;
int flag;
char str[30],end[30];
char a[30],b[30];
int c;
while(scanf("%d",&n)!=EOF&&n!=-1)
{
// init();
lu.clear();
flag=0;
memset(len,inf,sizeof(len));
scanf("%s%s",str,end);
if(strcmp(str,end)==0)
flag=1;
lu[str]=1;
lu[end]=2;
int inter=3;
for(int i=0;i<n;i++)
{
scanf("%s%s%d",a,b,&c);
if(!lu[a])
lu[a]=inter++;
if(!lu[b])
lu[b]=inter++;
len[lu[a]][lu[b]]=len[lu[b]][lu[a]]=c;
}
if(flag)
{
printf("0\n");
continue;
}
dijkstra(1,inter);
if(dis[2]==inf) printf("-1\n");
else printf("%d\n",dis[2]);
}
}