1021. Deepest Root (25)

来源:互联网 发布:农村淘宝合伙人网站 编辑:程序博客网 时间:2024/06/14 10:18

1021. Deepest Root (25)

时间限制
1500 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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 5
Sample Output 1:
345
Sample Input 2:
51 31 42 53 4
Sample 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;}


0 0
原创粉丝点击