首页 > 其他分享 >bfs练习题-PTA喊山

bfs练习题-PTA喊山

时间:2025-01-16 20:13:50浏览次数:1  
标签:练习题 dist 山头 int ne 喊山 bfs visited

喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用。(图文摘自:http://news.xrxxw.com/newsshow-8018.html)
一个山头呼喊的声音可以被临近的山头同时听到。题目假设每个山头最多有两个能听到它的临近山头。给定任意一个发出原始信号的山头,本题请你找出这个信号最远能传达到的地方。
输入格式:
输入第一行给出3个正整数n、m和k,其中n(≤10000)是总的山头数(于是假设每个山头从1到n编号)。接下来的m行,每行给出2个不超过n的正整数,数字间用空格分开,分别代表可以听到彼此的两个山头的编号。这里保证每一对山头只被输入一次,不会有重复的关系输入。最后一行给出k(≤10)个不超过n的正整数,数字间用空格分开,代表需要查询的山头的编号。
输出格式:
依次对于输入中的每个被查询的山头,在一行中输出其发出的呼喊能够连锁传达到的最远的那个山头。注意:被输出的首先必须是被查询的个山头能连锁传到的。若这样的山头不只一个,则输出编号最小的那个。若此山头的呼喊无法传到任何其他山头,则输出0。

输入样例:
7 5 4
1 2
2 3
3 1
4 5
5 6
1 4 5 7
输出样例:
2
6
4
0

解题思路:思考问题,发现该问题是符合给出一个点 然后找到它联系的另一个点 继续往下找,符合按层遍历的特点。符合bfs的特点,思考用bfs解决问题。

using namespace std;
const int MAXN=10005;
vector<int>adj[MAXN];      //绘制图 因为每一对山头只输入一次 所以可用数组下标和元素这样的建立关系(值得学习的地方1)
bool visited[MAXN];
int dist[MAXN];
int bfs(int n){               //输入的这个数 以这个数为开头 开始遍历 
	memset(visited,false,sizeof(visited));
	memset(dist,0,sizeof(dist));
	queue<int>q;
	q.push(n);          //入队 
	visited[n]=true;    //标记 
	int maxdist=0;      //题目要求找最远的  故要用打擂台比较 
	int result=0;       //最后输出的山头编号
	
	while(!q.empty()){
		int current=q.front();
		q.pop();               //出队(队首元素)开始遍历访问
		                       //遍历元素的套路 就是有没有访问过 然后根据题目入不入队 做什么判断 
		for(int ne:adj[current]) {//找这个点的邻居 建立遍历器ne 
			if(!visited[ne]){
				visited[ne]=true;
	            dist[ne]=dist[current]+1;
				if(dist[ne]>maxdist){
					maxdist=dist[ne];
					result=ne;            //更新最远山头的位置 
				}	
				else if(dist[ne]==maxdist){
			          result=min(ne,result);
					}
					q.push(ne); //将此邻居(关联点)入队; 
				}		
				
			}
		}if(maxdist==0)
		return 0;
		
	return result;	
	} 
	
	

int main(){
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=0;i<m;i++){
		int u,v;
		cin>>u>>v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	while(k--){
		int num;
		cin>>num;
		cout<<bfs(num)<<"\n";
	}
	return 0;
}`
``

反思:技巧1.根据一对山头不重复输入的特性 利用数组下标和元素一一对应
2.bfs的基本思路:
思考准备需要的数据
将起始节点放入队列
将起始节点标记为已访问
当队列不为空时,循环执行以下操作:
               将队头节点弹出,访问该节点,将与该节点相邻的且未访问的节点入队(并根据题目要求进行相应的对应措施),并标记为已访问;
搜索完毕
通常可用于解决图的遍历,最短路问题,联通块问题等

标签:练习题,dist,山头,int,ne,喊山,bfs,visited
From: https://www.cnblogs.com/yue-mikasa/p/18675670

相关文章

  • 【搜索】多源BFS专题
    跳马(多源BFS变种,每个起点有步数限制)补充几个测试样例输入32..2...输出0输入3547.484744.7....输出17输入34.....2......输出0输入34.....22.....输出-1本题很坑爹的地方在于,输入的字符串还用空格......
  • BFS 2025/1/16
    BFSBasic主要特点:空间复杂度较高,基于队列经常用于求最优解的搜索题经典模型:连通块,最短迷宫路径,曼哈顿距离Question01[ACP2056山峰与山谷]主体是广搜模板难点在于如何判断当前联通块是山峰或山谷考虑在广搜时进行维护如果BFS检测到的区域不是在当前连通......
  • JS事件高级(练习题)
    1.div跟随鼠标移动(键盘事件和鼠标事件)<!--<script>//键盘事件window.onload=function(){varbox1=document.querySelector(".box1");//为document绑定一个按键按下的事件document.onkeydown=function(event){......
  • 【C语言分支和循环练习题】
    分支和循环练习1.打印1-100之间的所有素数2.随机数的生成:生成100-200之间的随机数1.打印1-100之间的所有素数#include<stdio.h>#include<math.h>intmain(){ inti=0; for(i=101;i<=200;i+=2) { intflag=1;//假设i是素数 intj=0; for(......
  • Hive SQL必刷练习题:复购率问题
    是说这个数据表中,找到最后一天,也就是今天的日期,max(date)over()Stoday【借助开窗函数】截至最后一天位置,也就是“今天“,表中的最新的一天去看90天内“某商品复购率=近90天内购买它至少两次的人数÷购买它的总人数”首先分析两个度量值,统计粒度是不一样的近90天内......
  • 背包九讲练习题
    01背包有N种物品和一个容量为V的背包,每种物品只有1个,第i种物品的体积为v[i],价值为w[i]。问将哪些物品装入背包,可使总体积不超过背包容量,且总价值最大,输出最大值。0<N,V<=1000;0<v[i],w[i]<=1000#include<bits/stdc++.h>intmain(){intN,V;std::cin>>N>>V;......
  • 2025华为OD机试已正式切换E卷,E卷新题正在火热更新中,支持在线OJ练习题目,三种语言解答,每
    文章目录......
  • BFS
    BFS(广度优先搜索,Breadth-FirstSearch)是一种用于遍历或搜索树或图的算法。它的核心思想是从起始节点开始,逐层向外扩展,先访问离起始节点最近的节点,再访问更远的节点。BFS通常使用队列(Queue)来实现。BFS的核心思想逐层扩展:从起始节点开始,先访问所有与起始节点直接相连的节点(第......
  • DFS与BFS专题
    99.岛屿数量讲解:https://programmercarl.com/kamacoder/0099.岛屿的数量广搜.html#思路DFS代码#include<iostream>#include<cstring>usingnamespacestd;constintN=55;intn,m;intg[N][N];boolst[N][N];intdx[4]={-1,0,1,0},dy[4]={0,1,0,-1......
  • 我在广州学 Mysql 系列——与索引相关的练习题
    ℹ️大家好,我是练小杰,今天星期二啦,还有三天就是星期五了,为了美好生活奋斗吧朋友们!本文将学习MYSQL中数据表内容的索引相关练习题目~~复习:......