1021 Deepest Root (25)(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 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
题意:
给出n个节点(1~n),并给出n-1个边,求图的连通分量。如果连通分量为1,则求图对应的树的最大深度对应的root,如果不唯一则按升序排列输出。
思路:
柳婼 の blog
1.先通过DFS判断图的连通分量个数。
2.任取一个顶点,DFS求得最高高度的结点们,然后从中任取一个结点,再做一个DFS求得最高高度的结点们,做一个并集得到最终结果。
题解:
1 #include<cstdio> 2 #include<vector> 3 #include<set> 4 using namespace std; 5 vector<vector<int>> mp; 6 bool isVisit[10010]; 7 int maxHeight = 1; 8 vector<int> temp; 9 set<int> s; 10 void dfs(int node, int height) { 11 if (height > maxHeight) { 12 temp.clear(); 13 temp.push_back(node); 14 maxHeight = height; 15 } 16 else if (height == maxHeight) { 17 temp.push_back(node); 18 } 19 isVisit[node] = true; 20 for (int i = 0; i < mp[node].size(); i++) { 21 if (isVisit[mp[node][i]] == false) { 22 dfs(mp[node][i], height + 1); 23 } 24 } 25 } 26 int main() { 27 int n; 28 scanf("%d", &n); 29 mp.resize(n + 1); 30 int a, b; 31 for (int i = 1; i < n; i++) { 32 scanf("%d %d", &a, &b); 33 mp[a].push_back(b); 34 mp[b].push_back(a); 35 } 36 int cnt = 0; 37 int s1; 38 for (int i = 1; i <= n; i++) { 39 if (isVisit[i] == false) { 40 dfs(i, 1); 41 //假设cnt为1,将temp中的值放入s中。 42 //如果cnt>1,这些值虽然不对,但也没用上。 43 if (i == 1) { 44 if (temp.size() != 0) s1 = temp[0]; 45 for (int j = 0; j < temp.size(); j++) { 46 s.insert(temp[j]); 47 } 48 } 49 cnt++; 50 } 51 } 52 if (cnt >= 2) { 53 printf("Error: %d components\n", cnt); 54 } 55 else { 56 temp.clear(); 57 fill(isVisit, isVisit + 10010, false); 58 dfs(s1, 1); 59 for (int i = 0; i < temp.size(); i++) { 60 s.insert(temp[i]); 61 } 62 for (set<int>::iterator it = s.begin(); it != s.end(); it++) { 63 printf("%d\n", *it); 64 } 65 } 66 return 0; 67 }