1021 Deepest Root (25 分)连通图个数、图的遍历dfs
①测试点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相关推荐
- 【分析】1021 Deepest Root (25 分)【DFS解法】
立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 A graph which is connected and acyclic can be considered a tree. ...
- 1021 Deepest Root (25 分) 【难度: 中 / 知识点: 树的直径 连通块】
https://pintia.cn/problem-sets/994805342720868352/problems/994805482919673856 方法一: 数组模拟邻接表 第一步: 爆搜df ...
- 【PAT甲级】1021 Deepest Root (25 分)(暴力,DFS)
题意: 输入一个正整数N(N<=10000),然后输入N-1条边,求使得这棵树深度最大的根节点,递增序输出.如果不是一棵树,输出这张图有几个部分. trick: 时间比较充裕数据可能也不是很极限 ...
- 1021. Deepest Root (25)
题目链接:http://www.patest.cn/contests/pat-a-practise/1021 题目: 1021. Deepest Root (25) 时间限制 1500 ms 内存限制 ...
- 浙大PAT 1021. Deepest Root (25)
1021. Deepest Root (25) 时间限制 1500 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A graph ...
- 【PAT - 甲级1021】Deepest Root (25分)(并查集,暴力枚举)
题干: A graph which is connected and acyclic can be considered a tree. The height of the tree depends ...
- PTA Deepest Root (25分)
释放无限光明的是人心,制造无边黑暗的也是人心,光明和黑暗交织着,厮杀着,这就是我们为之眷恋又万般无奈的人世间. A graph which is connected and acyclic can b ...
- PAT甲级-1021 Deepest Root(25分)
题目:1021 Deepest Root(25分) 分析:找出以某个节点为根时,最深的根,这题可能会超时要用vector来表示二维数组 疑问:代码一是第二次写的超时了,代码二是第一次写的AC了,找不出 ...
- PAT甲级1021 Deepest Root :[C++题解]树的最大深度、并查集、dfs求树的深度
文章目录 题目分析 题目链接 题目分析 分析: 考察知识点:并查集.dfs.树的深度 给定n个结点,n-1条边,只要能保证只有1个连通分量,就是一棵树.否则的话就不是树,它是不连通的. 用并查集来看是 ...
- 【CCCC】L2-023 图着色问题 (25分),,图的染色判定,遍历
problem L2-023 图着色问题 (25分) 图着色问题是一个著名的NP完全问题.给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色 ...
最新文章
- 2019最新进展 | Transformer在深度推荐系统中的应用
- Python 内部:可调用对象是如何工作的
- java复习系列[6] - Java集合
- 一个nginx 502问题解决方案
- 22款Android App传藏后门用广告耗手机电量
- VS2013 堆栈溢出调查(0xC00000FD: Stack overflow)
- 基于springboot编写的小程序幸运转盘抽奖功能
- 疫情下企业面临的关键网络安全建设,去繁从简,保住核心安全
- Elasticsearch:sniffing 的最佳实践:What, when, why, how
- C++字符串内数字统计
- win10计算机日历不能用,手把手操作win10电脑日历打不开的详尽处理措施
- 快速排序——单边循环实现方式
- LGBM函数及参数详解
- 小猫咪图床源码,一款PHP超简洁本地图床
- HDU 3105 Fred's Lotto Tickets(数学题)
- 前端学习 之 JavaScript基础
- VTK Spline 样条曲线
- 安固士科技的智慧工地AI视频监控系统如何成为建筑工地的必备措施?
- USIM 相关知识,术语
- 小明一家过桥_小学数学最难的“小明过桥”问题,答案不一致,大学生吵翻了...
热门文章
- (简单明了)透彻理解电压前馈解耦算法
- 移动流量卡是月底清零吗,什么时候购买次月套餐?
- 计算机模拟器demo,房东模拟器(The Tenants)demo试玩版
- 魔兽世界服务端源码各个重要文件详细情况说明开服一条龙
- 【WZOI】默写数字
- iPhone手机蓝牙找不到AirPods耳机的解决方法
- python随机生成4位验证码并判断是否正确_python生成4位验证码
- ps添加的阴影怎么去除_PS怎么把阴影去掉
- 【面试题】能从底层角度聊聊volatile关键字的原理吗?
- 静态背景下运动目标检测 matlab_基于深度学习的视频目标检测综述