题目描述
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 FORMAT
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.
翻译:每个输入文件包括一组测试数据。对于每组测试数据,第一行包括一个正整数N(<=10000) 代表节点的个数,因此节点被标记为从1-N。接下来的N行,每一行包括两个毗邻节点,即一条边。
OUTPUT FORMAT
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.
翻译:对于每组测试数据,输出一行每个的最深节点。如果这样的节点不是唯一的,用升序输出他们的编号。如果给出的曲线图不是树,则输出”Error: K components”,K是图中的相连部分数。
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
解题思路
这道题判断是否有多棵树可以用并查集解决,而判断根节点的方法为先搜索一点,找到最远的节点集,再在最远的节点集中挑选一点搜索,并集即为答案。(参考晴神宝典《算法笔记》)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<set>
#include<vector>
#include<algorithm>
#define INF 99999999
using namespace std;
int N,data[10010],root[10010];
set<int>st;
set<int>::iterator ite;;
vector<int>dot[10010];
int ans[10010],ccount=0;
void init(){
for(int i=1;i<=N;i++){
data[i]=i;
}
}
int find(int x){
if(data[x]==x)return x;
else return data[x]=find(data[x]);
}
void unite(int a,int b){
a=find(a);
b=find(b);
if(a==b)return ;
else{
if(a<b)data[b]=a;
else data[a]=b;
}
}
bool occur[10010];
int Maxheight=0;
void dfs(int a,int height){
occur[a]=true;
if(height>Maxheight){
Maxheight=height;
st.clear();
}
if(height==Maxheight)st.insert(a);
for(int i=0;i<dot[a].size();i++){
int temp=dot[a][i];
if(occur[temp]==false){
dfs(temp,height+1);
}
}
}
int main(){
scanf("%d",&N);
int a,b;
init();
for(int i=0;i<N-1;i++){
scanf("%d%d",&a,&b);
dot[a].push_back(b);
dot[b].push_back(a);
unite(a,b);
}
int flag=1;
root[1]=1;
for(int i=1;i<=N;i++){
int temp=find(data[i]);
if(!root[temp])flag++,root[temp]=1;
}
if(flag>1)printf("Error: %d components\n",flag);
else{
memset(occur,0,sizeof(occur));
dfs(1,1);
Maxheight=0;
for(ite=st.begin();ite!=st.end();ite++)
ans[ccount++]=*ite;
memset(occur,0,sizeof(occur));
dfs(*st.begin(),1);
for(int i=0;i<ccount;i++)
st.insert(ans[i]);
for(ite=st.begin();ite!=st.end();ite++)
printf("%d\n",*ite);
}
return 0;
}