百炼:4083:我爱北大

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24369113/article/details/73730659

4083:我爱北大

总时间限制: 
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



这个题需要注意的一点在于,输入的时候可能出现重边,即可能a到b的路径他输入两次,后面一次比前面一次还要大,这样就会导致最后的结果错误。我在这里找了很久才找到这个问题。其他主要就是使用Floyd算法来求最短路径和所经过的点。




#include<iostream>
#include<vector>
#include<string>
#include<map>
#define INT_MAX 100000000

using namespace std;
map<int, string> num_lable;
map<string, int> lable_num;

string showpath(int a, int b, vector<vector<int>> path, vector<vector<int>> graph)
{
	string rt = "";
	vector<int> temppath = path[a];
	vector<string> result;
	result.push_back(num_lable[b]);
	int cur = b;
	while (temppath[cur]!=-1)
	{
		int t = temppath[cur];
		int dis = graph[cur][t];
		result.push_back("("+to_string(dis)+")");
		result.push_back(num_lable[t]);
		cur = t;
	}

	for (int i = result.size() - 1; i >= 0; i--)
	{
		if (i != 0)
			rt+= result[i] +"->";
		else
			rt+=result[i];
	}

	return rt;

}


int main()
{
	int p;
	cin >> p;
	
	for (int i = 0; i < p; i++)
	{
		string tems;
		cin >> tems;
		num_lable.insert(pair<int, string>(i, tems));
		lable_num.insert(pair<string, int>(tems, i));
	}

	vector<vector<int>> grah(p, vector<int>(p, INT_MAX));
	for (int i = 0; i < p; i++)
	{
		grah[i][i] = 0;
	}

	int q;
	cin >> q;
	for (int i = 0; i < q; i++)
	{
		string a, b;
		int l;
		cin >> a >> b >> l;
		int numa = lable_num[a];
		int numb = lable_num[b];
		if(l<grah[numa][numb])
		{
			grah[numa][numb] = l;
		    grah[numb][numa] = l;
		}

	}

	vector<vector<int>> dis(p, vector<int>(p, 0));//定义距离
	vector<vector<int>> path(p, vector<int>(p, -1));//定义路径

	for (int i = 0; i < p; i++)
	{
		for (int j = 0; j < p; j++)
		{
			dis[i][j] = grah[i][j];
			if (i != j&&grah[i][j]<INT_MAX)
				path[i][j] = i;
		}
	}

	for (int node = 0; node < p; node++)
	{
		for (int i = 0; i < p; i++)
		{
			for (int j = 0; j < p; j++)
			{
				if (dis[i][j]>(dis[i][node] + dis[node][j]))
				{
					dis[i][j] = dis[i][node] + dis[node][j];
					path[i][j] = path[node][j];
				}
			}
		}
	//	displayPath(path);
	}


	vector<string> result;
	int r;
	cin >> r;
	for (int i = 0; i < r; i++)
	{
		string a, b;
		cin >> a >> b;
		if (a == b)
			result.push_back(a);
		else {
			int numa = lable_num[a];
			int numb = lable_num[b];
			result.push_back(showpath(numa, numb, path, grah));
		}
	}
	for (int i = 0; i < result.size(); i++)
	{
		cout << result[i] << endl;
	}


		
		system("pause");
}


猜你喜欢

转载自blog.csdn.net/qq_24369113/article/details/73730659