1021. Deepest Root (25)-PAT甲级真题(图的遍历,dfs,连通分量的个数)
来源:互联网 发布:华北水利水电大学知乎 编辑:程序博客网 时间:2024/06/05 11:20
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 (<=10000) 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
题目大意:给出n个结点(1~n)之间的n条边,问是否能构成一棵树,如果不能构成则输出它有的连通分量个数,如果能构成一棵树,输出能构成最深的树的高度时,树的根结点。如果有多个,按照从小到大输出。
分析:首先深度优先搜索判断它有几个连通分量。如果有多个,那就输出Error: x components,如果只有一个,就两次深度优先搜索,先从一个结点dfs后保留最高高度拥有的结点们,然后从这些结点中的其中任意一个开始dfs得到最高高度的结点们,这两个结点集合的并集就是所求
#include <cstdio>#include <vector>#include <set>#include <algorithm>using namespace std;int n, maxheight = 0;vector<vector<int>> v;bool visit[10010];set<int> s;vector<int> temp;void dfs(int node, int height) { if(height > maxheight) { temp.clear(); temp.push_back(node); maxheight = height; } else if(height == maxheight){ temp.push_back(node); } visit[node] = true; for(int i = 0; i < v[node].size(); i++) { if(visit[v[node][i]] == false) dfs(v[node][i], height + 1); }}int main() { scanf("%d", &n); v.resize(n + 1); int a, b, cnt = 0; for(int i = 0; i < n - 1; i++) { scanf("%d%d", &a, &b); v[a].push_back(b); v[b].push_back(a); } int s1 = 0; for(int i = 1; i <= n; i++) { if(visit[i] == false) { dfs(i, 1); if(i == 1) { for(int j = 0; j < temp.size(); j++) { s.insert(temp[j]); if(j == 0) s1 = temp[j]; } } cnt++; } } if(cnt >= 2) { printf("Error: %d components", cnt); } else { temp.clear(); maxheight = 0; fill(visit, visit + 10010, false); dfs(s1, 1); for(int i = 0; i < temp.size(); i++) s.insert(temp[i]); for(set<int>::iterator it = s.begin(); it != s.end(); it++) printf("%d\n", *it); } return 0;}
- 1021. Deepest Root (25)-PAT甲级真题(图的遍历,dfs,连通分量的个数)
- PAT 甲级 1021. Deepest Root(dfs:无向图的最远路径、连通分量个数)
- 1013. Battle Over Cities (25)-PAT甲级真题(图的遍历,统计强连通分量的个数,dfs)
- PAT甲级真题1013. Battle Over Cities (25)(图的遍历,统计强连通分量的个数,dfs)
- pat甲级 1021. Deepest Root(bfs求连通分量)
- [PAT甲级]1013. Battle Over Cities (25)(图的遍历,统计强连通分量个数)
- 1094. The Largest Generation (25)-PAT甲级真题(bfs,dfs,树的遍历)
- 1034. Head of a Gang (30)-PAT甲级真题(图的遍历dfs)
- 【PAT甲级】1021. Deepest Root (25)
- PAT甲级练习1021. Deepest Root (25)
- 1021. Deepest Root (25) PAT 甲级
- PAT甲级1021. Deepest Root (25)
- PAT 甲级 1021. Deepest Root (25)
- PAT 甲级1021. Deepest Root (25)
- PAT 1021. Deepest Root (25)(dfs求每个root的层数)(待修改)
- [PAT-甲级]1021.Deepest Root
- PAT 甲级 Deepest Root (25)
- 1106. Lowest Price in Supply Chain (25)-PAT甲级真题(dfs,bfs,树的遍历)
- 模仿苹果手机屏保滚动条
- Django学习小记[2] —— Model
- MVVM架构的优缺点
- ApacherServer 与tomcat的区别
- 谈谈我对攻读计算机研究生的看法
- 1021. Deepest Root (25)-PAT甲级真题(图的遍历,dfs,连通分量的个数)
- CodeForces 597A Divisibility
- python 学习(十五)之 字典
- CSS3学习
- 图结构练习——最短路径
- lightoj 1045 - Digits of Factorial (数学-log运用--阶乘进制位数)
- poj 1905 Expanding Rods
- 【编程语言】Spark 下载及安装教程 CentOS 7
- poj Shortest Prefixes Babelfish 字典树的学习