栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

PAT甲级1003 Emergency (C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PAT甲级1003 Emergency (C++)

本题翻译:
题目给出四个数字,分别是N(多少城市)、M(有几条路)、C1(初始城市)、C2(救援城市)
第二行是给出五个城市分别有多少救援人员。
接下来的N行是城市x,城市y,两个城市的距离。
最后求到该城市的最短距离有几条路,在最短距离的情况下最多的救援人员是多少?
本题思路:
利用深度搜索进行图的遍历,寻找最短路径,顺带把救援人员进行统计。
详细代码样例:

//pat1003 深度优先搜索, 要求获得城市有路的连接 2.23 就刷这一道题 把思路捋清楚之后自己再写一遍
//给出四个数字 分别是 城市数量 路的条数 初始城市 救助城市
//每一行给出城市的人数 和距离、
//深度搜索 找最短的路 记录人数,在最短路的前提下 找最多的人数
#include 
using namespace std;
vector  v [500];//v[1]=2说明1号城市有2号城市的路 
int path;//记录到达C2有几条路 
int teams;
int num_of_team[500],dis[500][500];//每个城市救援人数 记录到达该点的最短距离 记录两个城市是否有路
int mindis[500] ;//在没有到之前默认每座城市两端都无穷大 
int N,M,C1,C2;//城市数量 路的条数 初始城市 救助城市
		void dfs(int curity,int curlen,int curteam){
		if(curlen>mindis[curity]) return;//如果走了的距离比我上次走的距离还远,就及时止损;说明有两条路都可以走到这个地,选择最短的路,在回溯当中属于是终止条件
		if(curity==C2){//说明已经到达了目的地,这个时候就需要开始判断这条路是不是最近的 
			if(curlen==mindis[curity]) {
				path++;//说明有两条路
				if(curteam>teams){//判断当前的救援人员和之前的救援人员哪个多 当前多就把当前人员赋值过去 只记录到达C2的救援人数去比较 
					teams=curteam;
				}
			}
				else{//否则就把path赋值为1,说明虽然两条一样的路到达 但是只有一条路人数最少 
					path=1;
					mindis[C2]=curlen;//更新该点的距离
					teams=curteam;//团队更新 到时候要输出的 
				}
			}
			else{
			if(curlen>N>>M>>C1>>C2;
	for(int i=0;i>num_of_team[i];//把每座城市的人存进去 
	} 
	for(int i=0;i>a>>b>>c;
		v[a].emplace_back(b);
		v[b].emplace_back(a);
		dis[a][b]=dis[b][a]=c;//a,b城市互通的距离为c 
	}
	//从初始城市找目标城市,一个一个遍历,找到最短距离 利用深搜
			for(int i=0;i 


本题难度还比较大,需要熟练掌握深搜,感谢b站的up主弄夫,太厉害啦!
up主的视频指路视频指路

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767010.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号