zoukankan      html  css  js  c++  java
  • 倍增求lca模板

    倍增求lca模板

    https://www.luogu.org/problem/show?pid=3379

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    using namespace std;
    int t,n,cnt,m;
    int x,y;
    int f[500001][20],p,root;
    int fa[500001];
    int id[500001];
    int head[500001];
    int s=1;
    struct node
    {
        int next,to;
    }e[500001*2];
    inline void add(int u,int v)
    {
        cnt++;
        e[cnt].to=v;
        e[cnt].next=head[u];
        head[u]=cnt;
    }
    inline void pre()
    {
        p=int(log(n)/log(2)+0.001);
        for(int i=1;i<=n;i++)
         if(fa[i]) f[i][0]=fa[i];
        for(int i=1;i<=p;i++)
         for(int j=1;j<=n;j++)
           f[j][i]=f[f[j][i-1]][i-1];
    }
    inline int query(int x,int y)
    {
        if(id[x]<id[y]) swap(x,y);
        for(int i=p;i>=0;i--)
         if(id[f[x][i]]>id[y])
          x=f[x][i];
        return f[x][0];
    }
    inline void dfs(int r)
    {
        for(int i=head[r];i;i=e[i].next)
        {
            int t=e[i].to;
            if(!id[t])
             {
                 id[t]=++s;
                 fa[t]=r;
                 dfs(t);
             }
        }
    }
    int main()
    {
            scanf("%d%d%d",&n,&m,&root);
            for(int i=1;i<n;i++)
            {
                scanf("%d%d",&x,&y);
                add(x,y);
                add(y,x);
            }
            id[root]=1;
            dfs(root);
            pre();
            for(int i=1;i<=m;i++)
            scanf("%d%d",&x,&y),
            printf("%d
    ",query(x,y));
    }
  • 相关阅读:
    装饰者模式
    代理模式
    享元模式
    模板模式
    命令模式
    建造者模式
    单例模式
    观察者模式
    迭代器模式
    访问者模式
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6827044.html
Copyright © 2011-2022 走看看