-
总时间限制:
- 1000ms 内存限制:
- 65535kB
-
描述
-
很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。
输入
-
输入分为三个部分。
第一个部分有P+1行(P<30),第一行为一个整数P,之后的P行表示上野公园的地点。
第二个部分有Q+1行(Q<50),第一行为一个整数Q,之后的Q行每行分别为两个字符串与一个整数,表示这两点有直线的道路,并显示二者之间的矩离(单位为米)。
第三个部分有R+1行(R<20),第一行为一个整数R,之后的R行每行为两个字符串,表示需要求的路线。
输出
- 输出有R行,分别表示每个路线最短的走法。其中两个点之间,用->(矩离)->相隔。 样例输入
-
6 Ginza Sensouji Shinjukugyoen Uenokouen Yoyogikouen Meijishinguu 6 Ginza Sensouji 80 Shinjukugyoen Sensouji 40 Ginza Uenokouen 35 Uenokouen Shinjukugyoen 85 Sensouji Meijishinguu 60 Meijishinguu Yoyogikouen 35 2 Uenokouen Yoyogikouen Meijishinguu Meijishinguu
样例输出
-
Uenokouen->(35)->Ginza->(80)->Sensouji->(60)->Meijishinguu->(35)->Yoyogikouen Meijishinguu
这题目并不难,直接套单源最短路算法的模版,理解模版的基础下,改了改,存储这条最短路上每个点的前一个点,放在front中,最后再存入temp数组里面让它从终点开始存进来,就变成正序了,注意下输出格式,就过了。这种思想在以前5*5的迷宫bfs上也出现过,要求输出迷宫路径的坐标
代码如下:
#include <iostream>
#include<string.h>
#include<cstdio>
using namespace std;
#define MAX 9999999
#define LEN 100+5
int map[LEN][LEN];
int dist[LEN];
int mark[LEN];
int front[LEN];
int p,q,r;
char name[LEN][LEN];
int find_number(char t[])
{
for(int i = 1; i <= p; i++)
{
if(strcmp(t,name[i]) == 0)
return i;
}
}
void init()
{
int i,j;
for(i=0;i<LEN;i++)
{
for(j=0;j<LEN;j++)
{
map[i][j]=MAX;
}
}
}
void myDijstra(int n,int start)
{
int i,j,min,pos;
for(i=1;i<=n;i++)
{
mark[i]=0;
dist[i]=map[start][i];
}
mark[start]=1;
dist[start]=0;
for(i=1;i<=n;i++)
{
min=MAX;
for(j=1;j<=n;j++)
{
if(!mark[j] && dist[j]<min)
{
min=dist[j];
pos=j;
}
}
if(min==MAX)
break;
mark[pos]=1;
for(j=1;j<=n;j++)
{
if(!mark[j] && dist[j]>dist[pos]+map[pos][j])
{
dist[j]=dist[pos]+map[pos][j];
front[j]=pos;
}
}
}
}
int main()
{
int i;
char a[LEN],b[LEN];
int d,an,bn,k;
int temp[LEN],t;
scanf("%d",&p);
init();
for(i = 1; i <= p; i++)
{
scanf("%s",name[i]);
}
scanf("%d",&q);
for(i=0;i<q;i++)
{
scanf("%s%s%d",&a,&b,&d);
an=find_number(a);
bn=find_number(b);
if(map[an][bn]>d)
{
map[an][bn]=map[bn][an]=d;
}
}
scanf("%d",&r);
while(r--)
{
cin >> a >> b;
an=find_number(a);
bn=find_number(b);
if(an!=bn)
{
myDijstra(p,an);
front[an]=an;
k = 0;
temp[k++]=bn;
t = front[bn];
while(t!=0)
{
temp[k++]=t;
t = front[t];
}
temp[k]=an;
while(k>=1)
{
cout << name[temp[k]] << "->" << "(" << map[temp[k]][temp[k-1]] << ")" << "->";
k--;
}
cout << name[temp[k]] << endl;
}
else
cout << name[an]<<endl;
}
return 0;
}