1021. Deepest Root (25)
来源:互联网 发布:农村淘宝合伙人网站 编辑:程序博客网 时间:2024/06/14 10:18
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:51 21 31 42 5Sample Output 1:
345Sample Input 2:
51 31 42 53 4Sample Output 2:
Error: 2 components
#include<iostream>#include<string.h>#include<map>#include<vector>#include<set>using namespace std;#define SIZE 10001int pre[SIZE];int cnt;map<int, vector<int>> tree;int length[SIZE];int root(int a){int ans = a;while (ans != pre[ans])ans = pre[ans];return ans;}void merge(int a, int b){int ra = root(a);int rb = root(b);if (ra != rb){pre[rb] = ra;cnt--;}}void dfs(int a){vector<int>::iterator iter;for (iter = tree[a].begin(); iter != tree[a].end(); iter++){if (length[*iter] == 0){length[*iter] = length[a] + 1;dfs(*iter);}}return;}int main(){int n,a,b;set<int> s,ss;cin >> n;cnt = n;for (int i = 0; i <= n;i++)pre[i] = i;for (int i = 1; i < n; i++){cin >> a >> b;tree[a].push_back(b);tree[b].push_back(a);merge(a, b);}if (cnt != 1){cout << "Error: " << cnt << " components" << endl;return 0;}length[1] = 1;dfs(1);int max = 0, index = 1;for (int i = 1; i <= n; i++){if (length[i] > max){max = length[i];ss.clear();ss.insert(i);}else if (length[i] == max)ss.insert(i);}max = 0;set<int>::iterator it = ss.begin();memset(length, 0, sizeof(int)*(n + 1));length[*it] = 1;dfs(*it);for (int i = 1; i <= n; i++){if (length[i] > max){max = length[i];s.clear();s.insert(i);}else if (length[i] == max){s.insert(i);}}for (set<int>::iterator it = ss.begin(); it != ss.end(); it++)s.insert(*it);for (set<int>::iterator iter = s.begin(); iter != s.end(); iter++){cout << *iter << endl;}return 0;}
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- 1021. Deepest Root (25)
- listview优化问题
- RMAN 备份
- HDU-1051 Wooden Sticks 【二维LIS(STL应用)+排序】
- JSP内置对象(一)
- 数据结构之队列的Java实现
- 1021. Deepest Root (25)
- TreeSet中自定义排序的两种方法
- HDU1513:Palindrome
- 关于UPnP Device Architecture 2.0的阅读笔记(六)
- JAVA学习代码——回音壁
- JZOJ 4687 奇袭【NOIP2016提高A组8.12】
- 贡献思路题目集合
- android5.0与6.0 sd卡挂载
- Fragment 布局属性 tools:layout 作用