一个连通的无环图可以看做是一棵树,但选定不同的结点作为根的话,树的结构会不同,树的高度也会不一样,现在需要你找到能形成最高树的根,也就是最深根。
输入格式:
首先在第一行给出结点的数目N,N小于10000,结点从1开始编号,随后N-1行,依次给出N-1条边。
输出格式:
对每一组输入,输出最深根的编号,如果有多个,则按从小到大的顺序输出,每行输出一个。如果不能构成树,则统计图有多少个连通块,输出“Error: K components”,其中K是连通块的数目。
输入样例1:
在这里给出一组输入。例如:
5
1 2
1 3
1 4
2 5
输出样例1:
在这里给出相应的输出。例如:
3
4
5
输入样例2:
在这里给出一组输入。例如:
5
1 3
1 4
2 5
3 4
输出样例2:
在这里给出相应的输出。例如:
Error: 2 components
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<cstring>
using namespace std;
vector<int>st[10005];
int vis[10005];
int dp[10005];
map<int,int>mp;
int maxx = -1;
int maxn = -1;
int n,ans;
void dfs(int x,int len){
vis[x]=1;
if(len>maxx){
maxx=len;
}
if(maxx>maxn){
maxn=maxx;
}
for(int i=0;i<st[x].size();i++){
if(!vis[st[x][i]])
dfs(st[x][i],len+1);
}
}
void graph(int x){
vis[x]=1;
for(int i=0;i<st[x].size();i++){
if(!vis[st[x][i]])
graph(st[x][i]);
}
}
int main ()
{
scanf("%d",&n);
for(int i=1;i<n;i++){
int a,b;
scanf("%d %d",&a,&b);
st[a].push_back(b);
st[b].push_back(a);
mp[a]++;
mp[b]++;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
graph(i);
ans++;
}
}
if(ans>1){
printf("Error: %d components\n",ans);
return 0;
}
for(int i=1;i<=n;i++){
if(mp[i]==1){
maxx=-1;
memset(vis,0,sizeof(vis));
dfs(i,0);
dp[i]=maxx;
}
}
for(int i=1;i<=n;i++){
if(dp[i]==maxn)
printf("%d\n",i);
}
return 0;
}