7-102 喊山 (30分)

喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用。(图文摘自: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

思路
开始也想到过并查集和dfs,这两种方法最后都没想出结果,最后用来bfs广度优先搜索。
下面介绍一下本题的bfs解题思路:
用搜索方法时,首先要知道用什么来存储树,在这里用的动态数组vector,这很关键(我开始就用的二ou维数组,最后就超时了)。
接着就是输入数据,常规的树的遍历了。我这里定义了一个数组d[]来保存每个节点的深度,就是通过这个来求解出最远的节点。
需要注意的是: 样例中有重复的点,比如1->2->3和1->3,这里的3相当于遍历了两次,不注意的话可能还会输出最远的山头是3呢;所以我做的处理是,在遍历树时,加入了一个判断,即 if(!vis[r[t][i]]&&!d[r[t][i]]),这里的!d[r[t][i]]防止了这种情况。因为在搜索离1最远的山头,肯定是以1为根节点遍历树,首先会遍历其孩子节点2,3可以得到d[2],d[3]均为1了。这样当再遍历到2的孩子节点3时,就不会再计算了,直接不满足if条件跳过了。
有疑问的话,欢迎大家留言,我们继续讨论,嘻嘻!

#include<bits/stdc++.h>
using namespace std;int vis[10010],d[10010],n,m,k,kk,t;  //vis[]表示节点是否出现过,d[]表示当前节点的深度
vector<int> r[10010]; //保存各个以r[i]为根结点的树
queue<int> qu;void bfs(){while(!qu.empty()){   //此循环为树的bfs t = qu.front();qu.pop();vis[t] = 1;for(int i=0; i<r[t].size(); i++){if(!vis[r[t][i]]&&!d[r[t][i]]){  //如果该节点没被访问过,而且其深度没被计算过 qu.push(r[t][i]);d[r[t][i]]=d[t]+1;}}}//根据d[i]找出最远的节点 int maxx=-1;  for(int i=0; i<=n; i++){if(d[i]>maxx) maxx=d[i];}for(int i=0; i<=n; i++){if(d[i]==maxx){cout << i << endl;break;}}return;
} int main(){ios::sync_with_stdio(false);  //加快输入速度 int a,b;cin >> n >> m >> k;while(m--){cin >> a >> b;r[a].push_back(b);r[b].push_back(a);}while(k--){cin >> kk;memset(vis, 0, sizeof(vis));memset(d, 0, sizeof(d));qu.push(kk);  //树的根节点 bfs();}return 0;
}


欢迎大家批评改正!!!

PTA:7-102 喊山 (30分)---解析(bfs广度优先搜索,vector)相关推荐

  1. 【CCCC】L3-008 喊山 (30分),BFS搜索最长路,水题

    problem L3-008 喊山 (30分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中 ...

  2. L3-008 喊山 (30 分)(bfs)

    喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的"讯号",达 ...

  3. 7-102 喊山 (30 分)(bfs

    添加链接描述 #include<bits/stdc++.h> using namespace std; const int N=1e4+9; vector<int>v[N]; ...

  4. PTA | 喊山 (30 分) BFS 拼题A

    喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的"讯号",达 ...

  5. 7-9 喊山 (30 分)

    喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的"讯号",达 ...

  6. 团体程序设计天梯赛(L3-008 喊山 (30 分))

    题目: 思路分析: 读懂题目就是一个求最短dijsktra+最长路的模型 代码实现: /* *@Author: GuoJinlong *@Language: C++ */ //#include < ...

  7. 【PTA练习】7-14 喊山 (30 分)BFS

    7-14 喊山 (30 分) *试题链接:https://pintia.cn/problem-sets/976477784184590336/problems/976477892020146189 题 ...

  8. L3-008 喊山 (30 分) 【 BFS 】

    L3-008 喊山 (30 分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成 ...

  9. 7-29 喊山 (30 point(s))

    喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的"讯号",达 ...

最新文章

  1. txt 乱码_STATA数据导入——将TXT、EXCEL、SAS、SPSS数据/批量导入STATA
  2. pyautogui 的用法 python自动操作鼠标、键盘
  3. SAP HUM嵌套HU场景下WM报表LS26里SU号码是外层HU号码
  4. 【solr专题之三】Solr常见异常
  5. 面试小问题——Object中有哪些常用方法?
  6. 使用tensorflow-serving部署tensorflow模型
  7. 【晨读】热爱 ▪ 英语 @ 热爱 ▪ 晨读
  8. Android Demo---如何敲出圆角的Button+圆角头像
  9. 拓端tecdat:已迁离北京外来人口的数据画像
  10. Delphi7--循环结构语句
  11. java后台管理 开源_12款开源的JAVA后台管理项目
  12. 五百丁简历下载的一种方法
  13. win10如何做到在指定目录下打开cmd命令窗口
  14. 超级跑车法拉利的历史
  15. 电脑变时钟,防止消息游戏新闻的打扰,形成高效率的办公和学习
  16. 【Unity】LineRenderer画运动轨迹
  17. 单位的计算机云空间容量,计算机中容量单位B、KB、MB、GB和TB的关系
  18. OKR 结果思维:为什么要以结果为导向?(第一部分)
  19. ArcMap设置地图显示标注
  20. ip地址分类及预留ip地址大全

热门文章

  1. Jmeter书中不会教你的(94)——将时间戳转换为日期格式
  2. GCC编译器与编译过程
  3. Asp.net core MVC paypal支付、回调——app支付
  4. python 通过调取百度接口进行图片OCR文字识别 高识别率
  5. 前端访问不到本地图片,IDEA设置Tomcat虚拟路径
  6. elementui时间选择器样式修改默认样式---修改宽度---修改日期图标
  7. puppeteer爬取豌豆荚数据
  8. 我的世界java边境之地_我的世界:前往边境之地的9个“诡异”现象!阳光也会被吞噬?...
  9. ffmpeg win10 ffmpeg 采集数据
  10. 关于H.248的树图规则