继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

LCA

holdtom
关注TA
已关注
手记 1846
粉丝 240
获赞 991


dfs

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int N=1e5+5;

vector<int> 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("%d\n",lca(x,y));

}

tarjan

/*

* @Author: qin_peng

* @Date:   2018-10-10 21:21:51

* @Last Modified by:   qin_peng

* @Last Modified time: 2018-10-11 16:13:23

*/

#include<bits/stdc++.h>

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];

vector<int>g[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<q[u].size();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("%d\n",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<<i)) break;

  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<<i) & d)

  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("%d\n",x==y? x:grand[x][0]);

}

 

int main(){

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

 for(int i=1;i<n;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数据结构


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP