• poj 1330 LCM 离线算法


    http://poj.org/problem?id=1330 题目

       1:  #include<stdio.h>
       2:  #include<string.h>
       3:  #include<iostream>
       4:  #include<vector>
       5:  using namespace std;
       6:   
       7:  int n;
       8:  int fa[11111],ancestor[11111];
       9:  bool path[11111],indegree[11111];
      10:  int ans;
      11:  vector<int> son[11111];
      12:  int a,b;
      13:  void init(){for(int i=0;i<n;i++)fa[i]=i;}
      14:  int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
      15:  void merge(int x,int y)
      16:  {
      17:      int xx=find(x),yy=find(y);
      18:      if(xx!=yy)fa[yy]=xx;
      19:  }
      20:  void LCA(int x)
      21:  {
      22:      path[x]=true,ancestor[x]=x;//分割当前子树,即当前子树的祖先都只可能是x
      23:      for(std::vector<int>::iterator ii=son[x].begin();ii!=son[x].end();ii++)
      24:      {
      25:          int i=*ii;
      26:          LCA(i);//处理孩子节点的子树
      27:          merge(x,i);//将孩子节点并入x的树中
      28:          ancestor[find(x)]=x;//将将i节点的子树的祖先都更新为x
      29:      }
      30:      /****
      31:      查询a和b的公共祖先时有两种情况
      32:          1.a是b的直接祖先,
      33:              这时首先在b节点进入判断,ancestor为a
      34:              再次进入a节点判断 ancestors还是a;
      35:          2.a和b属于一个公共祖先的两个子树上,(设a相对b在左边子树)
      36:              这时先在a中做下列判断,发现path[b]为false,
      37:              再在b中做下列判断,这时ancestors[a]已经更新为当前树的根节点了。
      38:      ****/
      39:      if(x==a&&path[b])
      40:          ans=ancestor[find(b)]+1;
      41:      else if(x==b&&path[a])
      42:          ans=ancestor[find(a)]+1;
      43:  }
      44:  int main()
      45:  {//freopen("in.txt","r",stdin);
      46:      int T;
      47:      scanf("%d",&T);
      48:      while(T--)
      49:      {
      50:          scanf("%d",&n);
      51:          memset(indegree,false,sizeof(indegree));
      52:          memset(path,false,sizeof(path));
      53:          for(int i=0;i<n;i++)son[i].clear();
      54:          init();
      55:          for(int i=1;i<n;i++)
      56:              scanf("%d%d",&a,&b),a--,b--,son[a].push_back(b),indegree[b]=true;
      57:          scanf("%d%d",&a,&b),a--,b--;
      58:          for(int i=0;i<n;i++)
      59:              if(!indegree[i]){LCA(i);break;}
      60:          cout<<ans<<endl;
      61:      }
      62:      return 0;
      63:  }
  • 相关阅读:
    Solr简介
    儿童节快乐
    添加新的内容分类
    weka
    Junit测试样例
    Linux MySQL单实例源码编译安装5.5.32
    perconatoolkit 工具集安装
    Linux MySQL单实例源码编译安装5.6
    MySQL 开机自启动
    mysql5.6之前需要账号的安全加固
  • 原文地址:https://www.cnblogs.com/dingxiaoxian/p/3448821.html
Copyright © 2020-2023  润新知