1:我爱北大
“红楼飞雪,一时英杰……”耳边传来了那熟悉的歌声。而这,只怕是我最后一次听到这个声音了。
想当年,我们曾经怀着豪情壮志,许下心愿,走过静园,走过一体,走过未名湖畔的每个角落。
想当年,我们也曾慷慨高歌,瞻仰民主与科学,瞻仰博雅塔顶,那百年之前的遗韵。
没错,我爱北大,我爱这个校园。
然而,从当我们穿上学位服的那一刻起,这个校园,就再也不属于我。它只属于往事,属于我的回忆。
没错,这,是我在北大的最后一日。此时,此景,此生,此世,将刻骨难忘。
再也没有了图书馆自习的各种纷纭,再也没有了运动场上的挥汗如雨,有的,只是心中永远的不舍,与牵挂。
夜,已深。人,却不愿离去。天边有一颗流星划过,是那般静,宁谧。
忍不住不回头,我的眼边,有泪光,划过。
这时候,突然有一位路人甲从你身旁出现,问你:从XX到XX怎么走?
索性,就让我再爱你一次。因为,北大永远在你心中。北大的地图,永远在你的心中。
轻手挥扬,不带走一分云彩。
输入输入分为三个部分。第一个部分有P+1行,第一行为一个整数P,之后的P行表示北大的地点。
第二个部分有Q+1行,第一行为一个整数Q,之后的Q行每行分别为两个字符串与一个整数,表示这两点有直线的道路,并显示二者之间的矩离(单位为米)。
第三个部分有R+1行,第一行为一个整数R,之后的R行每行为两个字符串,表示需要求的路线。
p<30,Q<50,R<20输出输出有R行,分别表示每个路线最短的走法。其中两个点之间,用->(矩离)->相隔样例输入
6
XueYiShiTang
CanYinZhongXin
XueWuShiTang
XueYiXiaoBaiFang
BaiNianJiangTang
GongHangQuKuanJi
6
XueYiShiTang CanYinZhongXin 80
XueWuShiTang CanYinZhongXin 40
XueYiShiTang XueYiXiaoBaiFang 35
XueYiXiaoBaiFang XueWuShiTang 85
CanYinZhongXin GongHangQuKuanJi 60
GongHangQuKuanJi BaiNianJiangTang 35
1
XueYiXiaoBaiFang BaiNianJiangTang
样例输出
XueYiXiaoBaiFang->(35)->XueYiShiTang->(80)->CanYinZhongXin->(60)->GongHangQuKuanJi->(35)->BaiNianJiangTang
提示很O疼的一道题。。。说出不少伤感事啊。两个最短路的算法都是可以用的,可以视情况选择你习惯的那个算法。
/*
在点的字符串与数字对应方面,做得不好
*/
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <string>
#include <cstring>
#include <algorithm>
#include <map>
#define maxn 37655
class poi//其实直接开一个数组就行了
{
public:
char addr[105];
};
poi po[35];
//len[i][j]记录i,j两点间最短路长
//rout[i][j]表示i,j两点间最短路的一个中间点,便于输出路径
int len[35][35] = {0}, rout[35][35] = {0};
int p = 0, q = 0, r = 0;
//用长为length的路径连接a,b
//需考虑重复边
void join(int a, int b, int length)
{
if (len[a][b] < length)//无需使用新路
{
return;
}
len[a][b] = length;
len[b][a] = length;
return;
}
void prout(int a, int b)//输出ab两点间的路径(递归)
{
int i_temp = rout[a][b];
if (i_temp == -1) printf("->(%d)->%s", len[a][b], po[b].addr);
else
{
prout(a, i_temp);
prout(i_temp, b);
}
return;
}
int main()
{
//init
for (int i = 0 ; i < 35; ++i)
for (int j = 0 ; j < 35; ++j)
{
rout[i][j] = -1;
if (i == j)
{
len[i][i] = 0;
continue;
}
len[i][j] = maxn;
}
//输入点
char ch_temp[105];
scanf("%d", &p);
for (int i = 0; i < p; ++i)
{
scanf ("%s", ch_temp);
strcpy(po[i].addr, ch_temp);
}
//输入路径
scanf ("%d", &q);
char cha[105], chb[105];
int leng = 0, ia = 0, ib = 0;
for (int i = 0 ; i < q; ++i)
{
scanf ("%s%s%d", cha, chb, &leng);
for (int j = 0 ; j < p; ++j)
{
if (!strcmp(po[j].addr, cha))
{
ia = j;
break;
}
}
for (int j = 0 ; j < p; ++j)
{
if (!strcmp(po[j].addr, chb))
{
ib = j;
break;
}
}
join(ia, ib, leng);//连接
}
/*test
for (int i = 0 ; i < p; ++i)
{
for (int j = 0; j < p; ++j)
printf ("%d ", len[i][j]);
printf ("\n");
}
*/
//floyd
for (int k = 0; k < p; ++k)
for (int i = 0; i < p; ++i)
for (int j = 0; j < p; ++j)
{
if (i == j) continue;
int i_temp = len[i][k] + len[k][j];
if (len[i][j] > i_temp)
{
len[i][j] = i_temp;
len[j][i] = i_temp;
rout[i][j] = k;
rout[j][i] = k;
}
}
//ask and ans
scanf("%d", &r);
for (int i = 0; i < r; ++i)
{
scanf ("%s%s", cha, chb);
for (int j = 0 ; j < p; ++j)
{
if (!strcmp(po[j].addr, cha))
{
ia = j;
break;
}
}
for (int j = 0 ; j < p; ++j)
{
if (!strcmp(po[j].addr, chb))
{
ib = j;
break;
}
}
printf("%s", po[ia].addr);
prout(ia, ib);
printf("\n");
}
return 0;
}