兔子与樱花

【问题描述】
很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。
【输入形式】
输入分为三个部分。
第一个部分有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;
}

菜鸡操作,中间变量设置的有点多,请自行斟酌修改。主要思想是佛洛依德算法,下一步更新狄杰斯科拉算法,还请各位前辈指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值