题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112
题目大意:给你N个公交车站,起点,终点,各站之间的距离,求起点到终点之间的最短距离。(起点终点相同距离为0)不能到达输出-1.
说真的开始看到这个题,我想利用数字标记那些地名,再利用dijsktra算法,但不知道如何用代码实现,后来在网上看博客
才知道有这样一个头文件#include<map>,map 映射,可以有这种效果,那么这题也就so easy!了,
我的AC代码
#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
#define Max 0x3f3f3f3f
using namespace std;
int dis[155],visit[155],maze[155][155];
int main(void)
{
int num,n,i,j,k,t,l,dist;
char begin[30],end[30];
char a[30],b[30];
map<string,int> station;
while(scanf("%d",&n)==1&&n!=-1)
{
memset(visit,0,sizeof(visit));
memset(maze,Max,sizeof(maze));
station.clear();
l=0;
scanf("%s%s",begin,end);
if(strcmp(begin,end)==0)
l=1;
station[begin]=1;
station[end]=2;
num=2;
for(i=0;i<n;i++)
{
scanf("%s%s%d",a,b,&dist);
if(!station[a])
station[a]=++num;
if(!station[b])
station[b]=++num;
maze[station[a]][station[b]]=maze[station[b]][station[a]]=dist;
}
if(l)
{
printf("0\n");
continue;
}
dis[1]=0;
for(i=2;i<=num;i++)
{
dis[i]=maze[1][i];
}
for(i=1;i<=num;i++)
{
t=Max;
for(j=1;j<=num;j++)
{
if(!visit[j]&&t>dis[j])
{
k=j;
t=dis[j];
}
}
if(t==Max) break;
visit[k]=1;
for(j=1;j<=num;j++)
{
if(!visit[j]&&dis[j]>dis[k]+maze[k][j])
dis[j]=dis[k]+maze[k][j];
}
}
if(dis[2]==Max)
printf("-1\n");
else
printf("%d\n",dis[2]);
}
return 0;
}