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 (≤104) 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
用并查集来求连通量,用深度优先搜索来求以每棵树为根结点时树的最大深度即可
满分代码如下;
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
//并查集
int fa[N],level[N],vst[N],maxlevel[N];
void init(){
for(int i=0;i<N;i++){
fa[i]=i;
}
}
int get(int x){
if(fa[x]==x)
return x;
return fa[x]=get(fa[x]);
}
void merge(int x,int y){
x=get(x);
y=get(y);
if(x!=y){
fa[x]=y;
}
}
bool same(int x,int y){
return get(x)==get(y);
}
vector<int>graph[N];
int n;
void dfs(int a,int start){
vst[a]=1;
for(auto i:graph[a]){
if(!vst[i]){
vst[i]=1;
level[i]=level[a]+1;
maxlevel[start]=max(maxlevel[start],level[i]);
dfs(i,start);
}
}
}
int main(){
init();
scanf("%d",&n);
int a,b;
for(int i=1;i<n;i++){
scanf("%d%d",&a,&b);
graph[a].push_back(b);
graph[b].push_back(a);
if(!same(a,b)){
merge(a,b);
}
}
int cnt=0;
//计算并查集中集合的数量
for(int i=1;i<=n;i++){
if(fa[i]==i){
cnt++;
}
}
if(cnt!=1){
printf("Error: %d components\n",cnt);
return 0;
}
memset(maxlevel,0,sizeof(maxlevel));
for(int i=1;i<=n;i++){
memset(level,0,sizeof(level));
memset(vst,0,sizeof(vst));
dfs(i,i);
}
int maxx=-1;
vector<int>ve;
for(int i=1;i<=n;i++){
if(maxlevel[i]>maxx){
maxx=maxlevel[i];
ve.clear();
ve.push_back(i);
}else if(maxlevel[i]==maxx){
ve.push_back(i);
}
}
for(int i=0;i<ve.size();i++){
printf("%d\n",ve[i]);
}
return 0;
}