描述
输入一棵树,判断每一棵子树的重心是哪一个节点。
输入描述
第一行输入n,q。n表示树的节点个数,q表示询问次数
第二行n-1个数,分别表示从节点2开始,各节点的父亲节点。
后面q行,每行一个数x,表示询问当前以x为根的子树中,树的重心位置。
输出描述
q行,每行表示一个答案
用例输入 1
7 4 1 1 3 3 5 3 1 2 3 5
用例输出 1
3 2 3 6
#include<bits/stdc++.h>
using namespace std;
int n;const int N=3e5+5;
vector<int>v[N];int fa[N],J[N],tp[N],sz[N];
void dfs(int x){sz[x]=1;int res=0;for(int i=0;i<v[x].size();i++){int y=v[x][i];dfs(y);sz[x]+=sz[y];if(sz[y]>sz[J[x]]) J[x]=y;}if(J[x]==0){tp[x]=x;return;}tp[x]=tp[J[x]];while(sz[tp[x]]*2<sz[x]) tp[x]=fa[tp[x]];
}
int main(){cin>>n;int m;cin>>m;for(int i=2;i<=n;i++){int x;cin>>x;fa[i]=x;v[x].push_back(i);}dfs(1);for(int i=1;i<=m;i++){int k;cin>>k;cout<<tp[k]<<endl;}}