poj 我爱北大

1:我爱北大

总时间限制:1000ms内存限制:65535kB描述

“红楼飞雪,一时英杰……”耳边传来了那熟悉的歌声。而这,只怕是我最后一次听到这个声音了。

想当年,我们曾经怀着豪情壮志,许下心愿,走过静园,走过一体,走过未名湖畔的每个角落。

想当年,我们也曾慷慨高歌,瞻仰民主与科学,瞻仰博雅塔顶,那百年之前的遗韵。

没错,我爱北大,我爱这个校园。

然而,从当我们穿上学位服的那一刻起,这个校园,就再也不属于我。它只属于往事,属于我的回忆。

没错,这,是我在北大的最后一日。此时,此景,此生,此世,将刻骨难忘。

再也没有了图书馆自习的各种纷纭,再也没有了运动场上的挥汗如雨,有的,只是心中永远的不舍,与牵挂。

夜,已深。人,却不愿离去。天边有一颗流星划过,是那般静,宁谧。

忍不住不回头,我的眼边,有泪光,划过。

这时候,突然有一位路人甲从你身旁出现,问你:从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;
}

转载于:https://my.oschina.net/locusxt/blog/175173

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值