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
通过并查集解决判断是否连通,然后用DFS计算各个结点深度!
#include<iostream> #include<vector> #include<map> #include<algorithm> using namespace std; map<int, vector<int>>graph; bool visited[10001]; int uset[10001]; int cnt; int maxDeep,mxDeep; vector<int>vecNode; void makeSet(int n) { for (int i = 0; i <= n; ++i) { uset[i] = i; } } int find(int x) { if (x != uset[x]) uset[x] = find(uset[x]); return uset[x]; } void unionSet(int x, int y) { int xp = find(x); int yp = find(y); if (xp != yp) { uset[xp] = yp; --cnt; } } void DFSDeep(int parent,int key,int deep) { if (deep > mxDeep) mxDeep = deep; if (graph[key].size() == 1 && deep != 0) return; for (int i = 0; i < graph[key].size(); ++i) { if (parent == graph[key][i]) continue; DFSDeep(key,graph[key][i],deep+1); } } int main() { int num,x,y; scanf("%d",&num); cnt = num - 1; makeSet(num); for (int i = 0; i < num-1; ++i) { scanf("%d%d",&x,&y); graph[x].push_back(y); graph[y].push_back(x); unionSet(x,y); } if (cnt != 0) { printf("Error: %d components", cnt + 1); return 0; } maxDeep = 0; for (int i = 1; i <= num; ++i) { mxDeep = 0; DFSDeep(-1,i,0); //cout << i << "-----" << mxDeep << endl; if (mxDeep > maxDeep) { maxDeep = mxDeep; vecNode.clear(); vecNode.push_back(i); } else if (mxDeep == maxDeep) vecNode.push_back(i); } sort(vecNode.begin(),vecNode.end()); for (int i = 0; i < vecNode.size(); ++i) printf("%d\n",vecNode[i]); return 0; }