/*
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;
}
我爱北大
最新推荐文章于 2020-12-11 16:22:56 发布