zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
  • 相关阅读:
    鲲鹏服务器测试
    su与sudo的使用说明
    海天校园大型行业网站开发运营招募
    cat命令
    window与liunx下 nginx下载
    asp.net开发人员手册 昨天刚整理完
    centos nginx 安装文档 0.8.x
    高中物理公式、规律汇编表
    关于数据导入描述
    一键安装Nginx
  • 原文地址:https://www.cnblogs.com/thmyl/p/6363928.html
Copyright © 2011-2022 走看看