• LCA


    LCA

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define LL long long
    using namespace std;
    inline int read()
    {
    	int z=0,b=1;char cs=getchar();
    	while(cs<'0'||cs>'9'){if(cs=='-')b=-1;cs=getchar();}
    	while(cs>='0'&&cs<='9'){z=z*10+cs-'0';cs=getchar();}
    	return z*b;
    }
    const int N=5e5+5;
    struct graph
    {
    	int to,next;
    }gr[N<<1];
    int n,m,s,cnt,head[N],dep[N],f[N][30];
    void border(int u,int v)
    {
    	gr[++cnt]=(graph){v,head[u]};
    	head[u]=cnt;
    	return;
    }
    void pre_deal(int u,int fa)
    {
    	dep[u]=dep[fa]+1;
    	for(int i=1;i<=20;i++) f[u][i]=f[f[u][i-1]][i-1];
    	for(int i=head[u];i;i=gr[i].next)
    	{
    		int v=gr[i].to;
    		if(v==fa) continue;
    		f[v][0]=u;
    		pre_deal(v,u);
    	}
    	return;
    }
    int lca(int u,int v)
    {
    	if(dep[u]<dep[v]) swap(u,v);
    	for(int i=20;i>=0;i--)
    	{
    		if(dep[f[u][i]]>=dep[v]) u=f[u][i];
    		if(u==v) return u;
    	}
    	for(int i=20;i>=0;i--)
    	{
    		if(f[u][i]!=f[v][i])
    		{
    			u=f[u][i];
    			v=f[v][i];
    		}
    	}
    	return f[u][0];
    }
    int main()
    {
    	n=read(),m=read(),s=read();
    	for(int i=1;i<n;i++)
    	{
    		int x=read(),y=read();
    		border(x,y);
    		border(y,x);
    	}
    	pre_deal(s,0);
    	while(m--)
    	{
    		int x=read(),y=read();
    		printf("%d
    ",lca(x,y));
    	}
    	return 0;
    }
    
  • 相关阅读:
    第一次系统实践作业
    第03组 Beta版本演示
    第03组 Beta冲刺(4/4)
    第03组 Beta冲刺(3/4)
    第03组 Beta冲刺(2/4)
    第03组 Beta冲刺(1/4)
    Java程序(文件操作)
    Java程序(事件监听与计算机界面)
    Java(个人信息显示界面)
    Java(学生成绩管理)
  • 原文地址:https://www.cnblogs.com/Hawking-llfz/p/11864202.html
Copyright © 2020-2023  润新知