【问题描述】
很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。
【输入形式】
输入分为三个部分。
第一个部分有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<map>
#include<cstdio>
using namespace std;
map<string,int>map1;
map<int,string>map2;
string point_name;
string point_name_1;
int point_number;
int point_path_number;
int point_path;
int point_path_question;
int point_number_1;
int point_number_2;//floyd算法处理后找最短路径
void find(int a,int b,int c,int arr[30][30],int arr_next[30][30]){//更新距离和后元素数组 floy for(int k = 0;k<c;k++){for(int i = 0;i<c;i++){for(int j = 0;j<c;j++){if(arr[i][j]>arr[i][k]+arr[k][j]){arr[i][j] = arr[i][k] + arr[k][j];arr_next[i][j] = arr_next[i][k];}}}}int k = arr_next[a][b];if(a!=b){cout<<map2[a]<<"->("<<arr[a][k]<<")->";while(k!=b){cout<<map2[k]<<"->("<<arr[k][arr_next[k][b]]<<")->";k = arr_next[k][b];}}cout<<map2[b]<<endl;
}
int main(){//构建节点与标号的字典序 cin>>point_number;for(int i = 0;i<point_number;i++){cin>>point_name;map1[point_name] = i;map2[i] = point_name;}//构建两点之间路径的数组 cin>>point_path_number;int path[30][30];for(int i = 0;i<point_number;i++){for(int j = 0;j<point_number;j++){path[i][j] = 10000;}}//自己到自己的路径为零 for(int i = 0;i<point_number;i++){path[i][i] = 0;}//构建一个路径到另一个路径的中间点 int arr_next[30][30];for(int i = 0;i<point_number;i++){for(int j = 0;j<point_number;j++){arr_next[i][j] = j;}}//完善已知的两点之间的路径 for(int i = 0;i<point_path_number;i++){cin>>point_name;cin>>point_name_1;cin>>point_path;path[map1[point_name]][map1[point_name_1]] = path[map1[point_name_1]][map1[point_name]] = point_path;}//由问题类路径的起始点求出对应编号回带。 cin>>point_path_question;int question[10][2];for(int i = 0;i<point_path_question;i++){cin>>point_name;cin>>point_name_1;point_number_1 = map1[point_name];point_number_2 = map1[point_name_1];question[i][0] = point_number_1;question[i][1] = point_number_2; }for(int i = 0;i<point_path_question;i++){find(question[i][0],question[i][1],point_number,path,arr_next);}return 0;
}
菜鸡操作,中间变量设置的有点多,请自行斟酌修改。主要思想是佛洛依德算法,下一步更新狄杰斯科拉算法,还请各位前辈指教。