PAT Advanced 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 (≤) 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 5
Sample Output 1:
3
4
5
Sample Input 2:
5
1 3
1 4
2 5
3 4
Sample Output 2:
Error: 2 components
我们这题可以用两次DFS,第一次DFS进行找图的连通分量,第二次DFS从第一次DFS的一个点进行寻找,找出最大的点
#include "iostream" #include "set" #include "vector" using namespace std; int N, a, b; bool path[10100][10100] = {false}; bool vis[10100] = {false}; int max_height = -1; set<int> s; vector<int> vec; void dfs(int v, int height) { vis[v] = true; if(height > max_height) { max_height = height; vec.clear(); vec.push_back(v); }else if(height == max_height) vec.push_back(v); for(int i = 1; i <= N; i++) if(path[v][i] && !vis[i]) dfs(i, height + 1); } int main() { scanf("%d", &N); for(int i = 1; i <= N - 1; i++) { scanf("%d%d", &a, &b); path[a][b] = true; path[b][a] = true; } int components = 0; // find components for(int i = 1; i <= N; i++) { if(vis[i] == false) { dfs(i, 1); components++; } } if(components > 1) printf("Error: %d components\n", components); else { // find max max_height = 0; fill(vis, vis + N + 10, false); for(auto x: vec) s.insert(x); dfs(vec[0], 1); for(auto x: vec) s.insert(x); for(auto x: s) printf("%d\n", x); } return 0; }