A 树的重心
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+10;
vector<int>a[maxn];
map<pair<int,int>,bool> mp;
int d[maxn];
int minnum;
int n,m;
int cnt;
int res[maxn];
void dfs(int node ,int parent)
{
d[node]=1;
int maxnum=0;
for(int i=0;i<a[node].size();i++)
{
int son=a[node][i];
if(son!=parent)
{
dfs(son,node);
d[node]+=d[son];
maxnum=max(maxnum,d[son]);
}
}
maxnum=max(maxnum,n-d[node]);
if(maxnum<minnum)
{
cnt=0;
minnum=maxnum;
cnt++;
res[cnt]=node;
}
else if(maxnum==minnum)
{
cnt++;
res[cnt]=node;
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
mp.clear();
int tt=0;
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
if(u==v) continue;
if(u>v) swap(u,v);
if(mp[pair<int,int>(u,v)]) continue;
mp[pair<int,int>(u,v)]=true;
a[u].push_back(v);
a[v].push_back(u);
}
//if(tt!=n-1) printf("NO");
minnum=inf;
cnt=0;
dfs(1,0);
sort(res+1,res+cnt+1);
for(int i=1;i<=cnt;i++)
printf("%d ",res[i]);
printf("\n");
}
return 0;
}