• TTTTTTTTTTTTTTTTTT POJ 1330


    题意给一个有根树,一个查询节点(u,v)的最近公共祖先;

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    #include <algorithm>
    #include <set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long Ull;
    #define MM(a,b) memset(a,b,sizeof(a));
    const double eps = 1e-10;
    const int  inf =0x7f7f7f7f;
    const double pi=acos(-1);
    const int maxn=10000;
    int dep[maxn+10],par[maxn+10];
    int n,a,b,u,v;
    vector<int> G[maxn+10];
    
    void dfs(int cur,int d)
    {
        dep[cur]=d;
        for(int i=0;i<G[cur].size();i++)
             dfs(G[cur][i],d+1);
    }
    
    int main()
    {
        int cas;
        scanf("%d",&cas);
        while(cas--)
        {
            scanf("%d",&n);
            for(int i=1;i<=n;i++) G[i].clear();
            MM(par,0);
            for(int i=1;i<=n-1;i++)
            {
                scanf("%d %d",&a,&b);
                G[a].push_back(b);//降低复杂度,将n^2降至m
                par[b]=a;
            }
    
            int root;
            for(int i=1;i<=n;i++)
                if(!par[i])  {root=i;break;}
    
            dfs(root,1);//标记深度
            scanf("%d %d",&u,&v);
    
            if(dep[u]<dep[v]) swap(u,v);
            while(dep[u]>dep[v]) u=par[u];
    
            while(u!=v)
            {
                u=par[u];
                v=par[v];
            }
            printf("%d
    ",u);
        }
        return 0;
    }
    

      分析:最基础的LCA

  • 相关阅读:
    网络爬虫基础练习
    综合练习:词频统计
    Hadoop综合大作业
    理解MapReduce
    熟悉常用的HBase操作
    第三章、熟悉常用的HDFS操作
    爬虫大作业
    数据结构化与保存
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
  • 原文地址:https://www.cnblogs.com/smilesundream/p/5452390.html
Copyright © 2020-2023  润新知