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");
}