我爱北大

/*
1:我爱北大
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
“红楼飞雪,一时英杰……”耳边传来了那熟悉的歌声。而这,只怕是我最后一次听到这个声音了。

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

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

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

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

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

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

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

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

这时候,突然有一位路人甲从你身旁出现,问你:从XX到XX怎么走?

索性,就让我再爱你一次。因为,北大永远在你心中。北大的地图,永远在你的心中。

轻手挥扬,不带走一分云彩。

输入
输入分为三个部分。
第一个部分有P+1行,第一行为一个整数P,之后的P行表示北大的地点。地点长度不超过20个字符。
第二个部分有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
2
XueYiXiaoBaiFang BaiNianJiangTang
GongHangQuKuanJi GongHangQuKuanJi
样例输出
XueYiXiaoBaiFang->(35)->XueYiShiTang->(80)->CanYinZhongXin->(60)->GongHangQuKuanJi->(35)->BaiNianJiangTang
GongHangQuKuanJi
*/

/*解题思路
0. 求解图中两点间的最短距离,用Floyd算法
1. 为了将地名字符串和图中各点更好的对应,使用了map来建立映射
2. 递归输出
*/

#include<iostream>
#include<map>
#include<string>
using namespace std;
map<string, int> sour; // the hash from sites to integer 0,1,..
map<int, string> yuan;// the reversion of sour
int p, q, r;
#define maxn 40
#define infi 1000000;
class dist
{
public:
	int len;
	int pre;
};
dist D[maxn][maxn];
void output(int s, int e) // print recursively
{
	if (s == e)
	{
		cout << yuan[s];
		return;
	}
	output(s,D[s][e].pre);
	cout << "->" << '(' << D[D[s][e].pre][e].len << ')' << "->" << yuan[e];
}
int main()
{
	string tem;
	cin >> p;
	for (int i = 0; i<p; i++)
	{
		cin >> tem;
		sour.insert(pair<string, int>(tem, i));
		yuan.insert(pair<int, string>(i, tem));

	}
	//initialize the matrix 
	for (int i = 0; i<p; i++)
	{
		for (int j = 0; j<p; j++)
		{
			if (i != j)
			{
				D[i][j].len = infi;
				D[i][j].pre = -1;
			}
			else
			{
				D[i][j].len = 0;
				D[i][j].pre = i;
			}
		}
	}
	cin >> q;
	string fol1, fol2;
	int len;
	// modify the elements of the matrix.
	for (int i = 0; i<q; i++)
	{
		cin >> fol1 >> fol2 >> len;
		if (D[sour[fol1]][sour[fol2]].len>len)
		{
			D[sour[fol1]][sour[fol2]].len = len;
			D[sour[fol1]][sour[fol2]].pre = sour[fol1];
			D[sour[fol2]][sour[fol1]].len = len;
			D[sour[fol2]][sour[fol1]].pre = sour[fol2];
		}
	}
	int i, j, g;
	// dynamic programming,Floy算法
	for (g = 0; g<p; g++)
	{
		for (i = 0; i<p; i++)
		{
			for (j = 0; j<p; j++)
			{
				if (D[i][j].len > D[i][g].len + D[g][j].len)
				{
					D[i][j].len = D[i][g].len + D[g][j].len;
					D[i][j].pre = D[g][j].pre;
				}
			}
		}
	}
	cin >> r;
	for (int i = 0; i<r; i++)
	{
		cin >> fol1 >> fol2;
		output(sour[fol1], sour[fol2]);
		cout << endl;
	}
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值