①测试点3超时,我没有考虑有环的情况,拓扑排序好像是可以判断有向无环图吧,但题目给出了一定是n个顶点,n-1条边,如果有环,则一定不连通。应该是for dfs用太多啦
②memset的头文件是string.h,fill是algorithm
③并查集可以找两个集合的共同元素,也可以合并,但是求连通图个数,如果需要dfs,用这个最简单

 for(int i=1;i<=n;i++){if(vis[i]==false){dfs(i,1);block++;}}
#include<iostream>
#include<set>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=10001;
vector<int> vi[N];
set<int> s;
int maxheight=0;
bool vis[N]={false};
void dfs(int v,int h){if(h>maxheight){s.clear();s.insert(v);maxheight=h;}else if(h==maxheight){s.insert(v);}vis[v]=true;for(int i=0;i<vi[v].size();i++){if(vis[vi[v][i]]==false)dfs(vi[v][i],h+1);}
}int main(){int n,block=0;cin>>n;for(int i=0;i<n-1;i++){int a,b;cin>>a>>b;vi[a].push_back(b);vi[b].push_back(a);}for(int i=1;i<=n;i++){if(vis[i]==false){dfs(i,1);block++;}}if(block>1) cout<<"Error: "<<block<<" components"<<endl;else{for(int i=1;i<=n;i++){if(vis[i]==false){dfs(i,1);block++;}memset(vis,false,sizeof(vis));}for(auto it=s.begin();it!=s.end();it++)cout<<*it<<endl;}return 0;
}

然后修改后,结果是不输出5

#include<iostream>
#include<set>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=10001;
vector<int> vi[N];
set<int> s;
int maxheight=0;
bool vis[N]={false};
void dfs(int v,int h){if(h>maxheight){s.clear();s.insert(v);maxheight=h;}else if(h==maxheight){s.insert(v);}vis[v]=true;for(int i=0;i<vi[v].size();i++){if(vis[vi[v][i]]==false)dfs(vi[v][i],h+1);}
}int main(){int n,block=0;cin>>n;for(int i=0;i<n-1;i++){int a,b;cin>>a>>b;vi[a].push_back(b);vi[b].push_back(a);}for(int i=1;i<=n;i++){if(vis[i]==false){dfs(i,1);block++;}}if(block>1) cout<<"Error: "<<block<<" components"<<endl;else{set<int>::iterator it=s.begin();memset(vis,false,sizeof(vis));dfs(*it,1);for(it=s.begin();it!=s.end();it++)cout<<*it<<endl;}return 0;
}

原因:第一次dfs找到的是离1最远的点,得到了maxheight,但这只能得到该点一定是deepest,并且在该点的另一头也是deepest,从该点出发,得到的树高可能会大于第一次的maxheight,所以会清空第一次的结果。应该取并集

#include<iostream>
#include<set>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=10001;
vector<int> vi[N];
set<int> s,s1;
int maxheight=0;
bool vis[N]={false};
void dfs(int v,int h){if(h>maxheight){s.clear();s.insert(v);maxheight=h;}else if(h==maxheight){s.insert(v);}vis[v]=true;for(int i=0;i<vi[v].size();i++){if(vis[vi[v][i]]==false)dfs(vi[v][i],h+1);}
}int main(){int n,block=0;cin>>n;for(int i=0;i<n-1;i++){int a,b;cin>>a>>b;vi[a].push_back(b);vi[b].push_back(a);}for(int i=1;i<=n;i++){if(vis[i]==false){dfs(i,1);block++;}}if(block>1) cout<<"Error: "<<block<<" components"<<endl;else{set<int>::iterator it;for( it=s.begin();it!=s.end();it++)s1.insert(*it);it=s.begin();memset(vis,false,sizeof(vis));dfs(*it,1);for( it=s.begin();it!=s.end();it++)s1.insert(*it);for(auto it1=s1.begin();it1!=s1.end();it1++)cout<<*it1<<endl;}return 0;
}

不能清空vis对每一个v都dfs找到最大,虽然答案没问题,但是会超时。

1021 Deepest Root (25 分)连通图个数、图的遍历dfs相关推荐

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

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

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

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

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

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

  4. 1021. Deepest Root (25)

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

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

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

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

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

  7. PTA Deepest Root (25分)

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

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

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

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

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

  10. 【CCCC】L2-023 图着色问题 (25分),,图的染色判定,遍历

    problem L2-023 图着色问题 (25分) 图着色问题是一个著名的NP完全问题.给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色 ...

最新文章

  1. 2019最新进展 | Transformer在深度推荐系统中的应用
  2. Python 内部:可调用对象是如何工作的
  3. java复习系列[6] - Java集合
  4. 一个nginx 502问题解决方案
  5. 22款Android App传藏后门用广告耗手机电量
  6. VS2013 堆栈溢出调查(0xC00000FD: Stack overflow)
  7. 基于springboot编写的小程序幸运转盘抽奖功能
  8. 疫情下企业面临的关键网络安全建设,去繁从简,保住核心安全
  9. Elasticsearch:sniffing 的最佳实践:What, when, why, how
  10. C++字符串内数字统计
  11. win10计算机日历不能用,手把手操作win10电脑日历打不开的详尽处理措施
  12. 快速排序——单边循环实现方式
  13. LGBM函数及参数详解
  14. 小猫咪图床源码,一款PHP超简洁本地图床
  15. HDU 3105 Fred's Lotto Tickets(数学题)
  16. 前端学习 之 JavaScript基础
  17. VTK Spline 样条曲线
  18. 安固士科技的智慧工地AI视频监控系统如何成为建筑工地的必备措施?
  19. USIM 相关知识,术语
  20. 小明一家过桥_小学数学最难的“小明过桥”问题,答案不一致,大学生吵翻了...

热门文章

  1. (简单明了)透彻理解电压前馈解耦算法
  2. 移动流量卡是月底清零吗,什么时候购买次月套餐?
  3. 计算机模拟器demo,房东模拟器(The Tenants)demo试玩版
  4. 魔兽世界服务端源码各个重要文件详细情况说明开服一条龙
  5. 【WZOI】默写数字
  6. iPhone手机蓝牙找不到AirPods耳机的解决方法
  7. python随机生成4位验证码并判断是否正确_python生成4位验证码
  8. ps添加的阴影怎么去除_PS怎么把阴影去掉
  9. 【面试题】能从底层角度聊聊volatile关键字的原理吗?
  10. 静态背景下运动目标检测 matlab_基于深度学习的视频目标检测综述