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> #include <cstdio> #include <set> #include <cstring> using namespace std; vector<vector<int> > vec; vector<bool> visit; int maxH = 0; void DFS(int node, int h, set<int> &st) { visit[node] = true; for (vector<int> ::iterator iter = vec[node].begin(); iter != vec[node].end(); ++iter) { if (visit[*iter] == false) DFS(*iter, h + 1, st); } if (h > maxH) { maxH = h; st.clear(); st.insert(node); } else if(h == maxH) st.insert(node); } vector<int> root; int findRoot(int node) { if (root[node] == 0) return node; else return root[node] = findRoot(root[node]); } int main(void) { int n; scanf("%d", &n); vec.resize(n + 1); visit.resize(n+1,false); root.resize(n+1, 0); int s1, s2; for (int i = 1; i < n; ++i)//边的数量为n-1 { scanf("%d%d", &s1, &s2); vec[s1].push_back(s2); vec[s2].push_back(s1); s1 = findRoot(s1); s2 = findRoot(s2); if (s1 != s2) root[s1] = s2; } //通过并查判断是否在连通图个数 int count = 0; for (int i = 1; i <= n; ++i) { if (root[i] == 0) ++count; } if (count > 1) { printf("Error: %d components\n", count); return 0; } set<int> st1, st2; DFS(1, 0, st1); for (int i = 1; i <= n; ++i) visit[i] = false; DFS(*st1.begin(), 0, st2); for (set<int>::iterator iter = st2.begin(); iter != st2.end(); ++iter) st1.insert(*iter); for (set<int>::iterator iter = st1.begin(); iter != st1.end(); ++iter) printf("%d\n", *iter); return 0; }