题目意思
给你n个车站,接着是n条路线,现在要从起点到终点,问最短距离是多少。
解题思路
这就是一道简单的最短路问题,唯一的问题就在于这道题的输入的是一个地名而不是以前经常写的数字,其实这个做个简单的处理就行。我们用map来将地名映射成数字,就变成了一道原来常做的最短路问题。
代码部分
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <map>
#define INF 0x3f3f3f3f
using namespace std;
int dis[155];
int vis[155];
int maps[155][155];
int dijkstra(int u,int n)
{
int pos=u;
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++)
{
dis[i]=maps[u][i];
vis[i]=0;
}
vis[u]=1;
dis[1]=0;
for(int i=1; i<=n; i++)
{
int minn=INF;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
pos=j;
}
}
vis[pos]=1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]>dis[pos]+maps[pos][j])
dis[j]=dis[pos]+maps[pos][j];
}
}
return dis[2];
}
int main()
{
string s,e;
bool flag;
int ans,n,t;
map < string , int > M;
while(scanf("%d",&n)&&n!=-1)
{
M.clear();
for(int i=1; i<=155; i++)
for(int j=1; j<=155; j++)
maps[i][j]=INF;
cin>>s>>e;
M[s]=1;
M[e]=2;
int cnt=3;
flag=0;
if(s==e)
flag=1;
for(int i=1; i<=n; i++)
{
cin>>s>>e>>t;
if(!M[s])
M[s]=cnt++;
if(!M[e])
M[e]=cnt++;
maps[M[s]][M[e]]=maps[M[e]][M[s]]=t;
}
if(flag)
{
printf("0\n");
continue;
}
ans=dijkstra(1,cnt);
if(ans==INF)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}