兔子与樱花
题目内容:
很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。
输入格式:
输入分为三个部分。
第一个部分有P+1行(P<30),第一行为一个整数P,之后的P行表示上野公园的地点。
第二个部分有Q+1行(Q<50),第一行为一个整数Q,之后的Q行每行分别为两个字符串与一个整数,表示这两点有直线的道路,并显示二者之间的矩离(单位为米)。
第三个部分有R+1行(R<20),第一行为一个整数R,之后的R行每行为两个字符串,表示需要求的路线。
输出格式:
输出有R行,分别表示每个路线最短的走法。其中两个点之间,用->(矩离)->相隔。
输入样例:
6 Ginza Sensouji Shinjukugyoen Uenokouen Yoyogikouen Meijishinguu 6 Ginza Sensouji 80 Shinjukugyoen Sensouji 40 Ginza Uenokouen 35 Uenokouen Shinjukugyoen 85 Sensouji Meijishinguu 60 Meijishinguu Yoyogikouen 35 2 Uenokouen Yoyogikouen Meijishinguu Meijishinguu
输出样例:
Uenokouen->(35)->Ginza->(80)->Sensouji->(60)->Meijishinguu->(35)->Yoyogikouen Meijishinguu
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include<map>
using namespace std;
map<string, int> si;
map<int, string> is;
class dist
{
public:
int len;
int pre;
};
dist D[40][40];
void Floyd(int p)
{
int i, j, g;
for (g = 0; g < p; g++)
{
for (i = 0; i < p; i++)
{
for (j = 0; j < p; j++)
{
if (D[i][g].len + D[g][j].len < D[i][j].len)
{
D[i][j].len = D[i][g].len + D[g][j].len;
D[i][j].pre = D[g][j].pre;
}
}
}
}
}
void result(int f, int t)
{
if (f == t)
{
cout << is[f];
return;
}
result(f, D[f][t].pre);
cout << "->" << '(' << D[D[f][t].pre][t].len << ')' << "->" << is[t];
}
// vector<edge>edges;
int main(int argc, char const *argv[])
{ int p;
cin >> p;
for (int i = 0; i < p; ++i)//输入地点,并将地点与标号对应
{ string temp;
cin >> temp;
si.insert(pair<string, int>(temp, i));
is.insert(pair<int, string>(i, temp));
}
for (int i = 0; i < p; ++i)//初始化D数组
{
for (int j = 0; j < p; ++j)
{
if (i != j)
{
D[i][j].len = 100000; //初始化权值矩阵
D[i][j].pre = -1; //初始化path矩阵
}
else
{
D[i][j].len = 0;
D[i][j].pre = i;
}
}
}
int q;
cin >> q;
for (int i = 0; i < q; ++i)
{ string from, to;
int far;
cin >> from >> to >> far;
if (D[si[from]][si[to]].len > far) {
D[si[from]][si[to]].len = far;
D[si[from]][si[to]].pre = si[from];
D[si[to]][si[from]].len = far;
D[si[to]][si[from]].pre = si[to];
}
// cout<<from<<to<<far<<endl;
}
Floyd(p);
int r;
cin >> r;
for (int i = 0; i < r; ++i)
{ string a, b;
cin >> a >> b;
result(si[a], si[b]);
cout << endl;
}
return 0;
}