分析
很容易想到类似于树的重心的东西,只要这个点所有子树大小不超过一半即可
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N=1e4+10; struct Graph { int v,nx; }g[2*N]; int cnt,list[N],sz[N],ans[N]; int n; void Add(int u,int v) { g[++cnt]=(Graph){v,list[u]};list[u]=cnt; g[++cnt]=(Graph){u,list[v]};list[v]=cnt; } void DFS(int u,int fa) { bool b=1; sz[u]=1; for (int i=list[u];i;i=g[i].nx) if (g[i].v!=fa) { DFS(g[i].v,u); sz[u]+=sz[g[i].v]; if (sz[g[i].v]>n/2) b=0; } if (n-sz[u]<=n/2&&b) ans[++cnt]=u; } int main() { scanf("%d",&n); for (int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),Add(u,v); cnt=0;DFS(1,-1); sort(ans+1,ans+cnt+1); for (int i=1;i<=cnt;i++) printf("%d ",ans[i]); if (!cnt) printf("NONE"); printf(" "); }