Deepest Root

思路:
1.进行一次dfs,统计有多少连通区域,如果n个点只有1个连通区域,就是树,如果多于1个连通区域,即证明不是树

2.如果是树,采用类似高中化学找碳链最长子链的方法:
①第一次dfs2,以任意一个结点(random),开始dfs找到最大深度终点1 2
②第二次dfs2,以找到的最深终点(1 2)为起点,进行dfs,找到最大深度(到3 4)

3.注意本题对访问日志的处理为

 book[cur]=1;dfs(cur);

VS:在寻找城市之间最短路径时所使用的dfs:

 book[cur]=1;dfs(cur);book[cur]=0;

为什么存在重新置0?
因为本题为树的dfs,不存在相互连通(一个城市只会与一个城市相连),而城市之间的最短路径的问题中城市之间相互连通(一个城市可能与多个城市相连)

解答:

#include<iostream>
#include<vector>
#include<set>
using namespace std;vector<int> v[10001];
int visited[10001];
vector<int>farthest_point;
int maxdis=0;
set<int>final_answer;void dfs(int cur){//及时止损if(visited[cur]) return;visited[cur]=1;//标记这个点被访问//统计有多少个连通分量,所以不需要维护变量for(int i:v[cur]){//遍历当前点的所有邻居dfs(i);}
}
void dfs2(int cur,int depth){if(visited[cur]) return;visited[cur]=1;//标记已访问if(depth>maxdis){maxdis=depth; //更新最大深度farthest_point.clear(); //先清空再更新farthest_point.emplace_back(cur); //清空最远点集合之后将这个点放进去}else if(depth==maxdis){//同等深度就不需要清空点集,只需要把这个等深度加进去就可以了farthest_point.emplace_back(cur);}for(int i:v[cur]){//访问当前结点的邻居dfs2(i,depth+1);}
}
int main(){int N,i,j,k;cin>>N;//N个点最少需要N-1条边将他们全部连接起来,所以从1到Nfor(i=1;i<N;i++){cin>>j>>k;v[j].emplace_back(k);v[k].emplace_back(j);}//先判断for(int i=1;i<=N;i++)visited[i]=0;int cnt=0;//注意这里是要统计有多少个连通分量for(int i=1;i<=N;i++){if(!visited[i]){cnt++;dfs(i);}}if(cnt>1){//不是树,即成环了cout<<"Error: "<<cnt<<" components";}else{//遍历整个图只能找到一个连通的点集,即是树for(int i=1;i<=N;i++)visited[i]=0;dfs2(1,0);  //第一次dfs2&&随便找一个起点进行DFSfor(int each:farthest_point) final_answer.insert(each);//将第一次dfs2中全部点转移到final_answer中,并清空最深数据,进行下一次dfs2farthest_point.clear();maxdis=0;for(int i=1;i<=N;i++)visited[i]=0;dfs2(*final_answer.begin(),0);//第二次dfs2&&取出来的是指针,所以要加*//第二次dfs2所得到的最深点也全部放入final_answer中for(int each:farthest_point) final_answer.insert(each);for(int each:final_answer) { cout<<each<<'\n'; }}//经过dfs2之后就会找到以随便找的一个点为起点所能找到的最大深度的终点//再以这些最深终点为起点,再进行一次dfs就可以找到最大深度return 0;
}

PTA-1021-Deepest Root相关推荐

  1. PAT甲级1021 Deepest Root :[C++题解]树的最大深度、并查集、dfs求树的深度

    文章目录 题目分析 题目链接 题目分析 分析: 考察知识点:并查集.dfs.树的深度 给定n个结点,n-1条边,只要能保证只有1个连通分量,就是一棵树.否则的话就不是树,它是不连通的. 用并查集来看是 ...

  2. 1021. Deepest Root (25)

    题目链接:http://www.patest.cn/contests/pat-a-practise/1021 题目: 1021. Deepest Root (25) 时间限制 1500 ms 内存限制 ...

  3. 浙大PAT 1021. Deepest Root (25)

    1021. Deepest Root (25) 时间限制 1500 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A graph ...

  4. PAT甲级-1021 Deepest Root(25分)

    题目:1021 Deepest Root(25分) 分析:找出以某个节点为根时,最深的根,这题可能会超时要用vector来表示二维数组 疑问:代码一是第二次写的超时了,代码二是第一次写的AC了,找不出 ...

  5. 【分析】1021 Deepest Root (25 分)【DFS解法】

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 A graph which is connected and acyclic can be considered a tree. ...

  6. 1021 Deepest Root

    要解决两大问题: 1. 数包含几个连通分量 2. 如何找到最深结点 注意:connected components的意思是连通分量 问题1我用并查集解决 问题2转化为如何得到每个结点的深度 值得注意之 ...

  7. 1021 Deepest Root (25 分) 【难度: 中 / 知识点: 树的直径 连通块】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805482919673856 方法一: 数组模拟邻接表 第一步: 爆搜df ...

  8. 【PAT甲级】1021 Deepest Root (25 分)(暴力,DFS)

    题意: 输入一个正整数N(N<=10000),然后输入N-1条边,求使得这棵树深度最大的根节点,递增序输出.如果不是一棵树,输出这张图有几个部分. trick: 时间比较充裕数据可能也不是很极限 ...

  9. 【PAT - 甲级1021】Deepest Root (25分)(并查集,暴力枚举)

    题干: A graph which is connected and acyclic can be considered a tree. The height of the tree depends ...

  10. PTA Deepest Root (25分)

    释放无限光明的是人心,制造无边黑暗的也是人心,光明和黑暗交织着,厮杀着,这就是我们为之眷恋又万般无奈的人世间. A graph which is connected and acyclic can b ...

最新文章

  1. 创建响应式布局的优秀网格工具集锦《系列五》
  2. SpringCloud:入门介绍
  3. LeetCode 16 3Sum Closest
  4. iOS 提交应用过程出现的错误及#解决方案#images can't contain alpha channels or transparencies...
  5. gentoo.tw的临时解决方法[转贴]
  6. Java StringBuffer与StringBuider
  7. java循环停止_什么时候java无限循环停止?
  8. C++中 static 关键字的作用
  9. 一层循环时间复杂度_数据结构:二叉排序树的前/中/后序遍历(递归与循环两种版本)...
  10. 信息学奥赛C++语言:数一数
  11. CV Code | 本周新出计算机视觉开源代码汇总(含图像修复、目标检测、医学图像分割、度量学习等)...
  12. 【java】linux命令获取百度的主页-模拟Socket三次握手
  13. 问题解决 Visual Studio 2015 无法复制文件“D:\swapfile.sys”
  14. 卡巴斯基许可Key需求登记表
  15. rdd和DF数据存入MYSQL
  16. 解决Chrome浏览器中使用showModalDialog返回值为undefined
  17. BI系统打包Docker镜像及容器化部署的具体实现
  18. Ubuntu 的护眼软件 :RedShift
  19. pacman 查询_archlinux pacman常用命令
  20. (28)部署强命名程序集到GAC

热门文章

  1. 变声算法实现(基频追踪+SOLA)
  2. 计算机视觉简介:历史、现状和发展趋势
  3. Codeforces1389 E. Calendar Ambiguity(数论)
  4. ldc java_Jvm规范中的LDC_W指令问题?
  5. 经纬度换算数值_常用经纬度转换
  6. js闭包循环原因_「js基础」JavaScript入门,难不难你来说
  7. 国内好用的邮箱评选,电子邮箱大全有你的吗?
  8. 益聚星荣|网络主播雪梨、林珊珊偷逃税被罚,2个月前已进行立案检查
  9. 阅读笔记0001之聊聊数据分析现状
  10. java广度优先爬虫示例_广度优先搜索与网络爬虫