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
解题思路:给出n个结点(1~n)之间的n条边,问是否能构成一棵树,如果不能构成则输出它有的连通分量个数,如果能构成一棵树,输出能构成最深的树的高度时,树的根结点。如果有多个,按照从小到大输出。考察知识点:并查集,图的遍历。
代码如下:
#include<stdio.h>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> Graph[10010];
queue<int> que;
int Tree[10010];
vector<int> ans;
bool visit[10010];
int tail, n;
int findRoot(int x)
{
if(Tree[x] == -1)
return x;
else
{
int tmp = findRoot(Tree[x]);
Tree[x] = tmp;
return tmp;
}
}
int findHeight(int x)
{
visit[x] = true;
int curHeight = 0;
que.push(x);
que.push(-1);
while(!que.empty())
{
if(que.front() == -1)
{
curHeight ++;
que.pop();
if(que.empty())
break;
else
que.push(-1);
}
int front = que.front();
tail = front;
for(int i = 0; i < Graph[front].size(); i ++)
{
if(!visit[Graph[front][i]])
que.push(Graph[front][i]);
visit[Graph[front][i]] = true;
}
que.pop();
}
for(int i = 1; i <= n; i ++)
visit[i] = false;
return curHeight;
}
int main()
{
freopen("D://input.txt", "r", stdin);
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
{
Tree[i] = -1;
visit[i] = false;
}
int a, b;
for(int i = 0; i < n-1; i ++)
{
scanf("%d%d", &a, &b);
Graph[a].push_back(b);
Graph[b].push_back(a);
a = findRoot(a);
b = findRoot(b);
if(a != b)
Tree[a] = b;
}
int count = 0;
for(int i = 1; i <= n; i ++)
{
if(Tree[i] == -1)
count ++;
}
if(count > 1)
{
printf("Error: %d components\n", count);
return 0;
}
else
{
int maxHeight, root;
for(int i = 1; i <= n; i ++)
{
if(Graph[i].size() == 1)
{
root = i;
break;
}
}
maxHeight = findHeight(root);
while(maxHeight != findHeight(tail))
{
root = tail;
maxHeight = findHeight(root);
}
for(int i = 1; i <= n; i ++)
{
if(findHeight(i) == maxHeight)
{
ans.push_back(i);
}
}
sort(ans.begin(), ans.end());
for(int i = 0; i < ans.size(); i ++)
printf("%d\n", ans[i]);
}
return 0;
}