• poj1330lca入门题


    直接套模板,dfs的时候注意起点

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=10000+10,maxn=500+100,inf=0x3f3f3f;
    
    vector<int>v[N];
    int depth[N],father[20][N];
    void dfs(int u,int f,int d)
    {
        depth[u]=d;
        for(int i=0;i<v[u].size();i++)
            if(v[u][i]!=f)
               dfs(v[u][i],u,d+1);
    }
    void init(int n)
    {
        int x=1;
        while(father[0][x]!=-1)x=father[0][x];
        dfs(x,-1,0);
        for(int i=1;i<20;i++)
            for(int j=1;j<=n;j++)
                father[i][j]=father[i-1][father[i-1][j]];
    }
    int lca(int x,int y)
    {
        if(depth[x]>depth[y])swap(x,y);
        for(int i=0;i<20;i++)
            if((depth[y]-depth[x])>>i&1)
                y=father[i][y];
        if(x==y)return x;
        for(int i=19;i>=0;i--)
        {
            if(father[i][x]!=father[i][y])
            {
                x=father[i][x];
                y=father[i][y];
            }
        }
        return father[0][x];
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int t,n;
        cin>>t;
        while(t--){
            cin>>n;
            for(int i=1;i<=n;i++)v[i].clear();
            memset(father,-1,sizeof father);
            memset(depth,0,sizeof depth);
            for(int i=1;i<n;i++)
            {
                int a,b;
                cin>>a>>b;
                father[0][b]=a;
                v[a].push_back(b);
            }
            init(n);
            int a,b;
            cin>>a>>b;
            cout<<lca(a,b)<<endl;
        }
        return 0;
    }
    /********************
    
    ********************/
    View Code
  • 相关阅读:
    一个好的时间函数
    Codeforces 785E. Anton and Permutation
    Codeforces 785 D. Anton and School
    Codeforces 510 E. Fox And Dinner
    Codeforces 242 E. XOR on Segment
    Codeforces 629 E. Famil Door and Roads
    Codeforces 600E. Lomsat gelral(Dsu on tree学习)
    Codeforces 438D The Child and Sequence
    Codeforces 729E Subordinates
    【ATcoder】D
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7245597.html
Copyright © 2020-2023  润新知