兔子与樱花 数算MOOC

 


                                                 兔子与樱花


题目内容:

很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。

 

输入格式:

输入分为三个部分。
第一个部分有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;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值