介个,,,会了1655很自然就会这个题了,简直就是一模一样的
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<algorithm>
#define INF 99999999
#define maxn 12000
using namespace std;
int n;
int p[maxn];
int ans[maxn],ic;
int num[maxn];
vector<int> g[maxn];
void build(int u)
{
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==p[u])continue;
p[v]=u;
build(v);
}
}
void init()
{
int x,y;
memset(p,-1,sizeof(p));
ic=0;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
build(1);
}
int dfs(int u)
{
int sum=0;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(p[u]==v)continue;
int res=dfs(v);
sum+=res;
num[u]=max(num[u],res);
}
num[u]=max(num[u],n-sum-1);
return sum+1;
}
//debug code
void op_tree(int u)
{
printf("%d ",u);
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==p[u])continue;
op_tree(v);
}
}
void op()
{
op_tree(1);
}//------------------debug code end
void solve()
{
for(int i=1;i<=n;i++)
num[i]=-INF;
dfs(1);
//op();
for(int i=1;i<=n;i++)
{
if(num[i]<=n/2)
{
ans[ic++]=i;
}
}
sort(ans,ans+ic);
//printf("----------------\n");
for(int i=0;i<ic;i++)
printf("%d\n",ans[i]);
//printf("-------------\n");
}
int main()
{
init();
solve();
return 0;
}