栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LCA

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LCA


dfs

#include

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int N=1e5+5;

vector g[N];

int deep[N],p[N];

void dfs(int u,int x,int pos)

{

    p[u]=x;

    deep[u]=pos;

    for(int i:g[u])

    {

        if(i!=x)

        {

            dfs(i,u,pos+1);

        }

    }

}

int lca(int u,int v)

{

    while(deep[u]>deep[v])u=p[u];

    while(deep[v]>deep[u])v=p[v];

    while(u!=v)u=p[u],v=p[v];

    return u;

}

int main()

{

    int n;cin>>n;

    for(int i=1,u,v;i^n;i++)

    {

        cin>>u>>v;

        g[u].push_back(v);

        g[v].push_back(u);

    }

    dfs(1,-1,0);

    int x,y;

    cin>>x>>y;

    printf("%dn",lca(x,y));

}

tarjan

#include

using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))

typedef long long ll;

typedef unsigned long long ull;

const int N=500005;

int vis[N],f[N],ans[N];

vectorg[N],p[N],q[N];

int father(int x)

{

    return f[x]==x?x:f[x]=father(f[x]);

}

void F(int x,int y)

{

    int fx=father(x),fy=father(y);

    if(fx!=fy)f[fx]=fy;

}

void tarjan(int u)

{

    vis[u]=1;

    for(int i:g[u])

    {

        if(!vis[i])

        {

            tarjan(i);

            F(i,u);

        }

    }

    for(int i=0;i

    {

        if(vis[q[u][i]])

        {

            ans[p[u][i]]=father(q[u][i]);

        }

    }

}

int main()

{

    int n,m;

    scanf("%d%d",&n,&m);

    for(int i=0;i<=n;i++)f[i]=i;

    for(int i=1,u,v;i^n;i++)

    {

        scanf("%d%d",&u,&v);

        g[u].push_back(v);

        g[v].push_back(u);

    }

    for(int i=1,u,v;i<=m;i++)

    {

        scanf("%d%d",&u,&v);

        q[u].push_back(v);

        q[v].push_back(u);

        p[u].push_back(i);

        p[v].push_back(i);

    }

    tarjan(1);

    for(int i=1;i<=m;i++)

    printf("%dn",ans[i]);

}

const int maxx = 500000 + 100;

 

int head[maxx],depth[maxx];

int n,m,x,y,root,num;

int grand[maxx][20+2];

bool done[maxx];

 

struct Edge{

 int next;

 int to;

}Edges[maxx<<1];

inline int Read(){

 int x=0,f=1;char c=getchar();

 while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}

 while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}

 return x*f;

}

 

void Add(int x,int y){

 Edges[++num].to=y;

 Edges[num].next=head[x];

 head[x]=num;

}

 

void Dfs(int x){

 done[x]=true;

 for(int i=1;i<=20;i++){

  if(depth[x] < (1<

  grand[x][i]=grand[grand[x][i-1]][i-1];

 }

 for(int i=head[x];i;i=Edges[i].next){

  int now=Edges[i].to;

  if(done[now]) continue;

  depth[now]=depth[x]+1;

  grand[now][0]=x;

  Dfs(now);

 }

}

 

void Lca(int x,int y){

 if(depth[x]>depth[y]) swap(x,y);

 int d=depth[y]-depth[x];

 for(int i=0;i<=20;i++){

  if((1<

  y=grand[y][i];

 }

 for(int i=20;i>=0;i--){

  if(grand[x][i]!=grand[y][i]){

   x=grand[x][i];

   y=grand[y][i];

  }

 }

 printf("%dn",x==y? x:grand[x][0]);

}

 

int main(){

 n=Read();m=Read();root=Read();

 for(int i=1;i

  x=Read();y=Read();

  Add(x,y);

  Add(y,x);

 }

 Dfs(root);

 while( m-- ){

  x=Read();y=Read();

  Lca(x,y);

 }

 return 0;

}

F[l]++,F[r]++,F[lca(l,r)]--,F[grand[lca(l,r)][0]]--;

F[l]++,F[r]++,F[lca(l,r)]-=2;

©著作权归作者所有:来自51CTO博客作者qinXpeng的原创作品,如需转载,请注明出处,否则将追究法律责任

lca51cto数据结构


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/232505.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号