$O(log(n))$求第k個父親節點
阿新 • • 發佈:2020-08-05
\(O(log(n))\)求第k個父親節點
// Created by CAD #include <bits/stdc++.h> using namespace std; const int maxn=5e5+5; vector<int> g[maxn]; int f[maxn][30],dep[maxn]; int lg[maxn]; void dfs(int x,int fa){ //預處理出深度,父親節點 f[x][0]=fa,dep[x]=dep[fa]+1; for(int i=1;i<=lg[dep[x]];++i) f[x][i]=f[f[x][i-1]][i-1]; for(auto i:g[x]) if(i!=fa) dfs(i,x); } int k_fa(int x,int k){ //倍增法求x的第k個父親節點 for(int i=0;i<=lg[k]-1;++i) if((1<<i)&k) x=f[x][i]; return x; } int main() { int n,r; scanf("%d%d",&n,&r); for(int i=1;i<=n-1;++i){ int a,b;scanf("%d%d",&a,&b); g[a].push_back(b); g[b].push_back(a); } for(int i=1;i<=n;++i) //預處理出log_2(i)+1的值 lg[i]=lg[i-1]+(1<<lg[i-1]==i); dfs(r,0); return 0; }