【问题描述】
很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。
【输入形式】
输入分为三个部分。
第一个部分有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;
}
菜鸡操作,中间变量设置的有点多,请自行斟酌修改。主要思想是佛洛依德算法,下一步更新狄杰斯科拉算法,还请各位前辈指教。
1568

被折叠的 条评论
为什么被折叠?



