zbyQIN

 

树链剖分模板

#include<bits/stdc++.h>
using namespace std;


int n,m,s;

const int N=2000005;

int cnt,head[N],nxt[N],to[N];
int dep[N],fa[N],top[N],siz[N],son[N];

void add(int x,int y)
{
    cnt++;
    nxt[cnt]=head[x];
    head[x]=cnt;
    to[cnt]=y;
 } 
 
 void dfs1(int x,int ff)
 {
     siz[x]=1;
     fa[x]=ff;
     int maxv=0;
     for(int i=head[x];i;i=nxt[i])
     {
         int y=to[i];
         if(y==ff)continue;
         dep[y]=dep[x]+1;
         dfs1(y,x);
         siz[x]+=siz[y];
         if(siz[y]>maxv)
         {
             maxv=siz[y];
             son[x]=y;
         }
     }
 }
 
 void dfs2(int x,int t)
 {
     top[x]=t;
     if(son[x])dfs2(son[x],t);
     for(int i=head[x];i;i=nxt[i])
     {
         int y=to[i];
         if(y==fa[x]||y==son[x])continue;
         dfs2(y,y);
     }
 }
 
 int lca(int x,int y)
 {
     while(top[x]!=top[y])
     {
         if(dep[top[x]]<=dep[top[y]])y=fa[top[y]];
         else x=fa[top[x]];
     }
     return dep[x]<=dep[y]?x:y;
 }
 
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m>>s;
    for(int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        add(x,y);
        add(y,x);
     } 
    dfs1(s,s);
    dfs2(s,s);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        cout<<lca(x,y)<<endl; 
    }
    
    
    
}

 

posted on 2025-03-12 15:38  秦風  阅读(8)  评论(0)    收藏  举报

导航