zoukankan      html  css  js  c++  java
  • poj 1330lca模板题离线算法

    #include<iostream>
    #include<vector>
    using namespace std;
    const int MAX=10001;
    int pre[MAX],visit[MAX],indegree[MAX];
    vector<int>qury[MAX],tree[MAX];
    int ancestor[MAX];
    void init(int n) {//初始化
     int i;
     for(i=1;i<=n;i++) {
      visit[i]=0;
      pre[i]=i;
      ancestor[i]=i;
      indegree[i]=0;
      qury[i].clear();
      tree[i].clear();
     }
    }
    int find(int x) {
     if(x!=pre[x])
      pre[x]=find(pre[x]);//路径压缩
     return pre[x];
    }
    void infind(int a,int b) {//合并
       int f1=find(a);
       int f2=find(b);
       if(f1==f2)
        return ;
        pre[f1]=f2;
       return ;
    }
    void lca(int u) {
     int i,len;
     len=tree[u].size();
     for(i=0;i<len;i++) {
      lca(tree[u][i]);
      infind(u,tree[u][i]);//将u和其子节点联系起来
      ancestor[find(u)]=u;//将所有u的子节点的点都指向u,即u为根
     }
     visit[u]=1;
     len=qury[u].size();
     for(i=0;i<len;i++)//
      if(visit[qury[u][i]]==1) {//如果找到直接输出
       printf("%d ",ancestor[find(qury[u][i])]);
       return ;
      }
    }
    int main() {
     int n,t,a,b,i;
     scanf("%d",&t);
     while(t--) {
      scanf("%d",&n);
      init(n);
      for(i=1;i<n;i++) {
       scanf("%d%d",&a,&b);
       tree[a].push_back(b);
       indegree[b]++;
      }
      scanf("%d%d",&a,&b);
      qury[a].push_back(b);
      qury[b].push_back(a);
      for(i=1;i<=n;i++)
       if(indegree[i]==0) {
        lca(i);
        break;
       }
     }
     return 0;
    }
  • 相关阅读:
    Scoket简介
    AOP
    Windows服务
    Nginx 教程 (1):基本概念
    异步编程
    并发编程
    常用排序
    序列化
    MSBuild/Projectjson
    不汇报是职场发展的绊脚石
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410892.html
Copyright © 2011-2022 走看看