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 5Sample Output 1:
3 4 5Sample Input 2:
5 1 3 1 4 2 5 3 4Sample Output 2:
Error: 2 components#include <iostream> #include <vector> using namespace std; vector<vector<int> > cot; vector<bool> visited; int *id; int *sz; int count; int max_length; int over_all; int find(int p) { while (p != id[p]) { // 将p节点的父节点设置为它的爷爷节点 id[p] = id[id[p]]; p = id[p]; } return p; } void union_set(int p, int q) { int i = find(p); int j = find(q); if (i == j) return; // 将小树作为大树的子树 if (sz[i] < sz[j]) { id[i] = j; sz[j] += sz[i]; } else { id[j] = i; sz[i] += sz[j]; } count--; } void dfs(int source,int length){ visited[source] = true; ++length; vector<int>::iterator it = cot[source].begin(); while(it != cot[source].end() && visited[*it]) ++it; if(it == cot[source].end()) { if(length > max_length){ max_length = length; } return ; } while(it != cot[source].end() && !visited[*it]){ dfs(*it,length); ++it; } } int main(){ std::ios::sync_with_stdio(false); int N; cin>>N; count = N; id = new int[N]; sz = new int[N]; for (int i = 0; i < N; i++) id[i] = i; for (int i = 0; i < N; i++) sz[i] = 1; cot.resize(N+1); for(int i = 1; i <N; ++i){ int x, y; cin>>x>>y; cot[x].push_back(y); cot[y].push_back(x); union_set(x-1,y-1); } if(count == 1){ visited.resize(N+1); vector<int> ret; for(int i = 1; i <= N; ++i){ visited.assign(N+1,false); max_length = -1; dfs(i,0); if(max_length > over_all){ over_all = max_length; ret.clear(); ret.push_back(i); } else if(max_length == over_all){ ret.push_back(i); } } vector<int>::iterator it = ret.begin(); while(it != ret.end()){ cout<<*it<<endl; ++it; } } else{ cout<<"Error: "<<count<<" components"; } }