题目分析
要求树以及树的重心
性质
重心 子树个数 *2
≥
\ge
≥ 所有个数
代码详解
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+50;
vector<int>G[maxn];
int ans[maxn];
int sz[maxn];
int fa[maxn];
void dfs(int u,int f)
{
sz[u] =1;
fa[u] =f;
int pos=0,t=0;
for(int i=0;i<G[u].size();i++)
{
int v = G[u][i];
// cout<<"u= "<<u<<"v= "<<v<<endl;
if(v==f)continue;
dfs(v,u);
sz[u]+=sz[v];
if(sz[v]>t)
{
t = sz[v];pos= v;
}
}
if(sz[u]==1||sz[u]==2) {
ans[u] = u;return;}
int x = ans[pos];
while(sz[x]*2<sz[u]) x = fa[x];
ans[u] = x;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++)
{
int x;
scanf("%d",&x);
G[x].push_back(i);
}
dfs(1,-1);
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
printf("%d\n",ans[x]);
}
return 0;
}