LCA 模板

求 LCA



模板


#include<cmath> 
#include<ctime> 
#include<cstdio> 
#include<cstdlib> 
#include<cstring> 
#include<iostream> 
#include<algorithm> 
#include<iomanip> 
#include<vector> 
#include<string> 
#include<queue> 
#include<set> 
#include<map> 
using namespace std; 
inline int read() 
{ 
    int x=0,f=1;char ch=getchar(); 
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} 
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} 
    return x*f; 
} 
const int N=100100; 
int n,m,s,ecnt,t,last[N],deep[N],dp[N][20]; 
bool inq[N]; 
struct EDGE{int to,nt;}e[N<<1]; 
inline void add(int u,int v){e[++ecnt]=(EDGE){v,last[u]};last[u]=ecnt;} 
void dfs(int u){for(int i=last[u];i;i=e[i].nt)if(!deep[e[i].to]){deep[e[i].to]=deep[u]+1;dp[e[i].to][0]=u;dfs(e[i].to);}} 
void initial(){for(int j=1;(1<<j)<=n;j++)for(int i=1;i<=n;i++)dp[i][j]=dp[dp[i][j-1]][j-1];} 
void query(int x,int y) 
{ 
    if(deep[x]<deep[y])swap(x,y); 
    int len=deep[x]-deep[y]; 
    for(int i=0;(1<<i)<=len;i++) 
    {if((1<<i)&len)x=dp[x][i];} 
    if(x==y){printf("%d\n",x);return ;} 
    for(int i=log2(N);i>=0;i--) 
    {if(dp[x][i]!=dp[y][i])x=dp[x][i],y=dp[y][i];} 
    x=dp[x][0]; 
    printf("%d\n",x); 
} 
int main() 
{ 
    n=read();m=read();int u,v; 
    for(int i=1;i<n;i++){u=read();v=read();add(u,v);add(v,u);} 
    deep[1]=1;dfs(1);initial(); 
    while(m--){u=read();v=read();query(u,v);} 
    return 0; 
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值