• 洛谷3379 最近公共祖先模板(倍增)


    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 500010
    #define S 21
    
    using namespace std;
    int deep[maxn],head[maxn],p1,p2,n,m,num,ans,s,x,y,fa[maxn][S+5];
    struct node {
        int from;
        int to;
        int next;
    }e[maxn*2];
    
    void add(int from,int to)
    {
        e[++num].from=from;
        e[num].to=to;
        e[num].next=head[from];
        head[from]=num;
    }
    
    int init()
    {
        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 swap(int &a,int &b)
    {
        int t=a;a=b;b=t;
    }
    
    void get_fa()
    {
        for(int j=1;j<=S;j++)
          for(int i=1;i<=n;i++)
            fa[i][j]=fa[fa[i][j-1]][j-1];
    }
    
    void Dfs(int now,int from,int c)
    {
        fa[now][0]=from;
        deep[now]=c;
        for(int i=head[now];i;i=e[i].next)
         {
             int v=e[i].to;
             if(v!=from)
               Dfs(v,now,c+1);
         }
    }
    
    int get_same(int a,int t)
    {
        for(int i=0;i<S;i++)
         if(t&(1<<i)) a=fa[a][i];
        return a;
    }
    
    int LCA(int a,int b)
    {
        if(deep[a]<deep[b]) swap(a,b);
        a=get_same(a,deep[a]-deep[b]);
        if(a==b) return a;
        for(int i=S;i>=0;i--)
                           
        {
            if(fa[a][i]!=fa[b][i])
                    {
                        a=fa[a][i];
                        b=fa[b][i];
                  }
        }
            return fa[a][0];
    }
    
    int main()
    {
        n=init();m=init();s=init();
        int x,y;
        for(int i=1;i<n;i++)
        { 
            x=init();y=init();
            add(x,y);
            add(y,x); 
        } 
        Dfs(s,s,0);
        get_fa();
        for(int i=1;i<=m;i++)
          {
              p1=init();p2=init();
            int ans=LCA(p1,p2);
            printf("%d
    ",ans);
          }
        return 0;
    }
  • 相关阅读:
    Extjs renderer函数
    孩子,教育,钱
    《新概念英语》的学习方法
    英语,想说爱你爱的太晚
    window.open模拟表单POST提交
    Extjs 解决grid分页bug问题
    Extjs 判断对象是非为null或者为空字符串
    linux shell 删除满足正则表达式的文件
    OpenCV 生成矩形mask
    测试Kaggle kernel commit 是否会删除以前的output
  • 原文地址:https://www.cnblogs.com/thmyl/p/7359315.html
Copyright © 2020-2023  润新知