描述
很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。
输入
输入分为三个部分。
第一个部分有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
实际就是求图任意两个顶点的最短路径:
- 可以通过以每个顶点作为源点循环求出没每队顶点之间的最短路径,即带入Dijkstra算法;
- 直接通过Floyd算法求解
具体参考:兔子与樱花---每对结点的最短路径
完整代码
#include <iostream>
#include <stdlib.h>
#include <string>
#include <map>
#define INF 32767
#define MAX_SIZE 100
#define MAX_LEN 50
using namespace std;
map<string,int> position_to_num;
map<int,string> num_to_position;
typedef struct
{
int len;
int pre;
}Postion;
Postion roads[MAX_SIZE][MAX_SIZE];
void DisRoads(int f, int s)
{
if (f == s) {
cout << num_to_position[f];
return;
}
DisRoads(f,roads[f][s].pre);
cout <<"->" <<"(" << roads[roads[f][s].pre][s].len <<")" <<"->" <<num_to_position[s];
}
int main(int argc, char const *argv[])
{
string position_name;
int P, Q, R, i, j, k;
/*******************第一部分*******************/
cin >> P;
for (i = 0; i < P; i++) {
cin >> position_name;
position_to_num.insert(pair<string,int>(position_name,i));
num_to_position.insert(pair<int,string>(i,position_name));
}
/******************初始化路径******************/
for (i = 0; i < P; i++) {
for (j = 0; j < P; j++) {
if (i != j) {
roads[i][j].len = INF;
roads[i][j].pre = -1;
} else {
roads[i][j].len = 0;
roads[i][j].pre = i;
}
}
}
/*******************第二部分*******************/
cin >> Q;
string position_name_first, position_name_second;
int len;
for (i = 0; i < Q; i++) {
cin >> position_name_first >> position_name_second >> len;
if (roads[position_to_num[position_name_first]][position_to_num[position_name_second]].len>len) {
//如果当前路径是最小路径
roads[position_to_num[position_name_first]][position_to_num[position_name_second]].len = len;
roads[position_to_num[position_name_first]][position_to_num[position_name_second]].pre = position_to_num[position_name_first];
roads[position_to_num[position_name_second]][position_to_num[position_name_first]].len = len;
roads[position_to_num[position_name_second]][position_to_num[position_name_first]].pre = position_to_num[position_name_second];
}
}
/*******************Floyd算法******************/
for (k = 0; k < P; k++) {
for (i = 0; i < P; i++) {
for (j = 0; j < P; j++) {
if (roads[i][j].len > roads[i][k].len + roads[k][j].len) {
roads[i][j].len = roads[i][k].len + roads[k][j].len;
roads[i][j].pre = roads[k][j].pre;
}
}
}
}
/*******************第三部分*******************/
cin >> R;
while (R--) {
cin >> position_name_first >> position_name_second;
DisRoads(position_to_num[position_name_first],position_to_num[position_name_second]);
cout << endl;
}
system("pause");
return 0;
}