PAT-1021 Deepest Root (25 分) 并查集判断成环和联通+求树的深度
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤104) which is the number of nodes, and hence the nodes are numbered from 1 to N. Then N−1 lines follow, each describes an edge by given the two adjacent nodes' numbers.
Output Specification:
For each test case, print each of the deepest roots in a line. If such a root is not unique, print them in increasing order of their numbers. In case that the given graph is not a tree, print Error: K components where K is the number of connected components in the graph.
Sample Input 1:
5
1 2
1 3
1 4
2 5
Sample Output 1:
3
4
5
Sample Input 2:
5
1 3
1 4
2 5
3 4
Sample Output 2:
Error: 2 components
交了一发暴力,居然过了,关键就是这个求树的深度,这题的主要坑点在于,如果不是一颗树要输出那个信息,如果成环了但是只有一个连通块,要输出
Error: 1 components
所以注意判断逻辑
int dfs(int x)
{
//de(x);
vis[x]=1;
int ma=0;
for(int i=0;i<(int)G[x].size();i++){
int v=G[x][i];
if(vis[v])continue;
ma=max(ma,dfs(G[x][i]));
}
return ma+1;
}
#include <iostream>
#include<bits/stdc++.h>
#define each(a,b,c) for(int a=b;a<=c;a++)
#define de(x) cout<<#x<<" "<<(x)<<endl
using namespace std;
const int maxn=1e4+5;
int father[maxn]; // 储存i的father父节点
void makeSet(int n) {
for (int i = 1; i <=n; i++)
father[i] = i;
}
int findRoot(int x) { // 迭代找根节点
int root = x; // 根节点
while (root != father[root]) { // 寻找根节点
root = father[root];
}
while (x != root) {
int tmp = father[x];
father[x] = root; // 根节点赋值
x = tmp;
}
return root;
}
void Union(int x, int y) { // 将x所在的集合和y所在的集合整合起来形成一个集合。
int a, b;
a = findRoot(x);
b = findRoot(y);
father[a] = b; // y连在x的根节点上 或father[b] = a为x连在y的根节点上;
}
vector<int>G[maxn];
/*
5
1 2
1 3
1 4
2 5
*/
int maxx;
int depth[maxn];
int vis[maxn];
int dfs(int x)
{
//de(x);
vis[x]=1;
int ma=0;
for(int i=0;i<(int)G[x].size();i++){
int v=G[x][i];
if(vis[v])continue;
ma=max(ma,dfs(G[x][i]));
}
return ma+1;
}
int main()
{
int n;
cin>>n;
makeSet(n);
int m=n-1;
int a,b;
int tree_flag=true;
while(m--)
{
scanf("%d%d",&a,&b);
if(findRoot(a)!=findRoot(b)){
Union(a,b);
G[a].push_back(b);
G[b].push_back(a);
}
else tree_flag=false;
}
//int components=0;
set<int>s;
for(int i=1;i<=n;i++)
{
//de(i);
//de(findRoot(i));
s.insert(findRoot(i));
}
//de(s.size());
if(tree_flag==false||s.size()!=1)
{
printf("Error: %d components\n",(int)s.size());
return 0;
}
maxx=0;
each(i,1,n)
{
memset(vis,0,sizeof(vis));
//de(i);
depth[i]=dfs(i);
}
each(i,1,n)
{
maxx=max(maxx,depth[i]);
}
each(i,1,n)
{
if(depth[i]==maxx)
{
cout<<i<<endl;
}
}
return 0;
}
PAT-1021 Deepest Root (25 分) 并查集判断成环和联通+求树的深度的更多相关文章
- 1021. Deepest Root (25)——DFS+并查集
http://pat.zju.edu.cn/contests/pat-a-practise/1021 无环连通图也可以视为一棵树,选定图中任意一点作为根,如果这时候整个树的深度最大,则称其为 deep ...
- PAT甲题题解-1021. Deepest Root (25)-dfs+并查集
dfs求最大层数并查集求连通个数 #include <iostream> #include <cstdio> #include <algorithm> #inclu ...
- PAT 甲级 1021 Deepest Root (25 分)(bfs求树高,又可能存在part数part>2的情况)
1021 Deepest Root (25 分) A graph which is connected and acyclic can be considered a tree. The heig ...
- [PAT] 1021 Deepest Root (25)(25 分)
1021 Deepest Root (25)(25 分)A graph which is connected and acyclic can be considered a tree. The hei ...
- 1021 Deepest Root (25 分)
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...
- 【PAT甲级】1021 Deepest Root (25 分)(暴力,DFS)
题意: 输入一个正整数N(N<=10000),然后输入N-1条边,求使得这棵树深度最大的根节点,递增序输出.如果不是一棵树,输出这张图有几个部分. trick: 时间比较充裕数据可能也不是很极限 ...
- PAT 1021 Deepest Root[并查集、dfs][难]
1021 Deepest Root (25)(25 分) A graph which is connected and acyclic can be considered a tree. The he ...
- PAT (Advanced Level) 1021. Deepest Root (25)
先并查集判断连通性,然后暴力每个点作为根节点判即可. #include<iostream> #include<cstring> #include<cmath> #i ...
- 1021. Deepest Root (25)
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...
随机推荐
- Linux 打开文件数
linux设置最大打开文件数 - daiyudong2020的博客 - CSDN博客 https://blog.csdn.net/daiyudong2020/article/details/77828 ...
- tomcat中设置Java 客户端程序的http(https)访问代理
1.假定http/https代理服务器为 127.0.0.1 端口为8118 2.在tomcat/bin/catalina.sh脚本文件中设置JAVA_OPTS,如下图: 保存后重启tomcat就能生 ...
- 各类型变量所占字节数,sizeof()
与操作系统位数和编译器都有关. 可用sizeof()得到,当前主流编译器一般是32位或64位. 类型 16位 32位 64位 char 1 1 1 sho ...
- bat 获取 exe 文件中 产品版本号并存储到变量中
set EXE='D:\gitlab\drivereasy3\DriverEasyWPF\bin\Release\DriverEasy.exe' powershell "(Get-Item ...
- 关于xadmin的网址收集
https://blog.csdn.net/yambo1992/article/details/80918250 https://www.colabug.com/4728510.html django ...
- 004-行为型-04-迭代器模式(Iterator)
一.概述 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示. 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部 ...
- Spring cloud微服务安全实战-5-3后端服务改造
本节来实现一个登陆的效果. 需要一个登陆前的页面和登陆后的页面. 直接粘贴过来的代码 这是一个和后台的绑定 后台要有个autenticated的对象来实现绑定,ts内我们定义这个autenticate ...
- 【问题解决】Flasgger mapping values are not allowed here?
参考来源:https://stackoverflow.com/questions/9055371/python-and-pyaml-yaml-scanner-scannererror-mapping- ...
- RabbitMQ 入门教程(PHP版) 延迟队列,延迟任务
延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新 ...
- 在Spring+MyBatis组合中使用事务
通过Spring和MyBatis的组合,给出一个较为详细的实例 代码清单:配置Spring+MyBatis测试环境 <?xml version='1.0' encoding='UTF-8' ? ...