总时间限制:
1000ms
内存限制:
65535kB
-
描述
-
很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。
输入
-
输入分为三个部分。
第一个部分有P+1行(P<30),第一行为一个整数P,之后的P行表示上野公园的地点。
第二个部分有Q+1行(Q<50),第一行为一个整数Q,之后的Q行每行分别为两个字符串与一个整数,表示这两点有直线的道路,并显示二者之间的矩离(单位为米)。
第三个部分有R+1行(R<20),第一行为一个整数R,之后的R行每行为两个字符串,表示需要求的路线。
输出
- 输出有R行,分别表示每个路线最短的走法。其中两个点之间,用->(矩离)->相隔。 样例输入
-
6GinzaSensoujiShinjukugyoenUenokouenYoyogikouenMeijishinguu6Ginza Sensouji 80Shinjukugyoen Sensouji 40Ginza Uenokouen 35Uenokouen Shinjukugyoen 85Sensouji Meijishinguu 60Meijishinguu Yoyogikouen 352Uenokouen YoyogikouenMeijishinguu Meijishinguu
样例输出
-
Uenokouen->(35)->Ginza->(80)->Sensouji->(60)->Meijishinguu->(35)->YoyogikouenMeijishinguu
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
const int INF =0x3f3f3f3f;
map <string ,int > q;
map <int ,string > p;
int mapp[100][100];
int vis[10010];
int low[5000];
int path[100010];
int re[10010];
int n,m,r;
string s1,s3,s2,s4,str;
void dijtsra(int x)
{
memset(vis,0,sizeof(vis));
memset(path,0,sizeof(path));
for(int i=1;i<=n;i++)
{
low[i]=INF;
path[i]=x;
}
low[x]=0;
for(int i=1;i<=n;i++)
{
int u=-1;
for(int j=1;j<=n;j++)
{
if((u==-1||low[j]<low[u])&&vis[j]==0)
{
u=j;
}
}
vis[u]=1;
for(int k=1;k<=n;k++)
{
if(vis[k]==0&&low[k]>low[u]+mapp[u][k])
{
low[k]=low[u]+mapp[u][k];
path[k]=u;
}
}
}
//printf("%d\n",low[q[s4]]);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
q.clear();
memset(re,0,sizeof(re));
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
{
if(i==j)
mapp[i][j]=0;
else
mapp[i][j]=INF;
}
for(int i=1;i<=n;i++)
{
cin>>str;
q[str]=i;
p[i]=str;
}
scanf("%d",&m);
while(m--)
{
int c;
cin>>s1>>s2>>c;
mapp[q[s1]][q[s2]]=mapp[q[s2]][q[s1]]=c;
}
scanf("%d",&r);
while(r--)
{
cin>>s3>>s4;
if(s3==s4)
cout<<s3<<endl;
else
{
dijtsra(q[s3]);
int v=0;
int keep=q[s4];
int keep2=q[s3];
while(keep!=q[s3])
{
re[v++]=keep;
keep=path[keep];
}
re[v++]=q[s3];
for(int i=v-1;i>0;i--)
{
cout<<p[re[i]]<<"->("<<mapp[re[i]][re[i-1]]<<")->";
}
cout<<s4<<endl;
}
}
}
return 0;
}