首页 > 代码库 > 倍增求lca模板

倍增求lca模板

倍增求lca模板

https://www.luogu.org/problem/show?pid=3379

#include<cstdio>#include<iostream>#include<cmath>#include<cstring>using namespace std;int t,n,cnt,m;int x,y;int f[500001][20],p,root;int fa[500001];int id[500001];int head[500001];int s=1;struct node{    int next,to;}e[500001*2];inline void add(int u,int v){    cnt++;    e[cnt].to=v;    e[cnt].next=head[u];    head[u]=cnt;}inline void pre(){    p=int(log(n)/log(2)+0.001);    for(int i=1;i<=n;i++)     if(fa[i]) f[i][0]=fa[i];    for(int i=1;i<=p;i++)     for(int j=1;j<=n;j++)       f[j][i]=f[f[j][i-1]][i-1];}inline int query(int x,int y){    if(id[x]<id[y]) swap(x,y);    for(int i=p;i>=0;i--)     if(id[f[x][i]]>id[y])      x=f[x][i];    return f[x][0];}inline void dfs(int r){    for(int i=head[r];i;i=e[i].next)    {        int t=e[i].to;        if(!id[t])         {             id[t]=++s;             fa[t]=r;             dfs(t);         }    }}int main(){        scanf("%d%d%d",&n,&m,&root);        for(int i=1;i<n;i++)        {            scanf("%d%d",&x,&y);            add(x,y);            add(y,x);        }        id[root]=1;        dfs(root);        pre();        for(int i=1;i<=m;i++)        scanf("%d%d",&x,&y),        printf("%d\n",query(x,y));}

 

倍增求lca模板