Closest Common Ancestors
Time Limit: 2000MS   Memory Limit: 10000K
Total Submissions: 20804   Accepted: 6608

Description

Write a program that takes as input a rooted tree and a list of pairs of vertices. For each pair (u,v) the program determines the closest common ancestor of u and v in the tree. The closest common ancestor of two nodes u and v is the node w that is an ancestor of both u and v and has the greatest depth in the tree. A node can be its own ancestor (for example in Figure 1 the ancestors of node 2 are 2 and 5)

Input

The data set, which is read from a the std input, starts with the tree description, in the form:

nr_of_vertices 
vertex:(nr_of_successors) successor1 successor2 ... successorn 
...
where vertices are represented as integers from 1 to n ( n <= 900 ). The tree description is followed by a list of pairs of vertices, in the form: 
nr_of_pairs 
(u v) (x y) ...

The input file contents several data sets (at least one). 
Note that white-spaces (tabs, spaces and line breaks) can be used freely in the input.

Output

For each common ancestor the program prints the ancestor and the number of pair for which it is an ancestor. The results are printed on the standard output on separate lines, in to the ascending order of the vertices, in the format: ancestor:times 
For example, for the following tree: 

Sample Input

5
5:(3) 1 4 2
1:(0)
4:(0)
2:(1) 3
3:(0)
6
(1 5) (1 4) (4 2)
      (2 3)
(1 3) (4 3)

Sample Output

2:1
5:5

Hint

Huge input, scanf is recommended.

Source

 
代码:

#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 10100
using namespace std;
char ch;
vector<int>vec[N],que[N];
int t,s,n,m,x,y,num,qx[N],qy[N],fa[N],dad[N],ans[N],root,ans1[N];
int read()
{
    ,f=; char ch=getchar();
    ; ch=getchar();}
    +ch-'; ch=getchar();}
    return x*f;
}
int find(int x)
{
    if(fa[x]==x) return x;
    fa[x]=find(fa[x]);
    return fa[x];
}
int tarjan(int x)
{
    fa[x]=x;
    ;i<vec[x].size();i++)
     if(vec[x][i]!=dad[x])
      dad[vec[x][i]]=x,tarjan(vec[x][i]);
    ;i<que[x].size();i++)
     if(dad[y=qx[que[x][i]]^qy[que[x][i]]^x])
      ans1[que[x][i]]=find(y);
    fa[x]=dad[x];
}
void begin()
{
    ;i<=n;i++)
     vec[i].clear(),que[i].clear();
    memset(fa,,sizeof(fa));
    memset(ans,,sizeof(ans));
    memset(dad,,sizeof(dad));
    memset(ans1,,sizeof(ans1));
}
int main()
{
    while(scanf("%d",&t)!=EOF)
    {
        s=t;begin();
        while(t--)
        {
            x=read();
            n=read();
            ;i<=n;i++)
            {
                y=read();fa[y]=x;
                vec[x].push_back(y);
                vec[y].push_back(x);
             }
        }
        ;i<=s;i++)
         if(!fa[i]) root=i;
        memset(fa,,sizeof(fa));
        memset(ans,,sizeof(ans));
        m=read();
        ;i<=m;i++)
        {
            qx[i]=read(),qy[i]=read();
            que[qx[i]].push_back(i);
            que[qy[i]].push_back(i);
        }
        tarjan(root);
        ;i<=m;i++)
          ans[ans1[i]]++;
        ;i<=s;i++)
         if(ans[i]) printf("%d:%d\n",i,ans[i]);
    }
    ;
}

tarjan暴空间、、、

O(≧口≦)O气死了,蒟蒻表示以后再也不用tarjan了!!!!!!!!!!!!

#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 910
using namespace std;
vector<int>vec[N];
int n,m,s,x,y,dad[N],fa[N],top[N],deep[N],size[N],ans[N];
int read()
{
    ,f=; char ch=getchar();
    ; ch=getchar();}
    +ch-'; ch=getchar();}
    return x*f;
}
int lca(int x,int y)
{
    for(;top[x]!=top[y];)
    {
        if(deep[top[x]]<deep[top[y]])
         swap(x,y);
        x=fa[x];
    }
    if(deep[x]>deep[y])
     swap(x,y);
    return x;
}
int dfs(int x)
{
    size[x]=;
    deep[x]=deep[fa[x]]+;
    ;i<vec[x].size();i++)
     if(vec[x][i]!=fa[x])
    {
        fa[vec[x][i]]=x;
        dfs(vec[x][i]);
        size[x]+=size[vec[x][i]];
    }
}
int dfs1(int x)
{
    ;
    if(!top[x]) top[x]=x;
    ;i<vec[x].size();i++)
     if(vec[x][i]!=fa[x]&&size[t]<size[vec[x][i]])
      t=vec[x][i];
    if(t) top[t]=top[x],dfs1(t);
    ;i<vec[x].size();i++)
     if(vec[x][i]!=fa[x]&&vec[x][i]!=t)
      dfs1(vec[x][i]);
}
int begin()
{
    ;i<=n;i++)
      vec[i].clear();
    memset(fa,,sizeof(fa));
    memset(top,,sizeof(top));
    memset(ans,,sizeof(ans));
    memset(dad,,sizeof(dad));
    memset(deep,,sizeof(deep));
    memset(size,,sizeof(size));
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        s=n;begin();
        while(n--)
        {
            x=read();m=read();
            ;i<=m;i++)
            {
                y=read();dad[y]=x;
                vec[x].push_back(y);
                vec[y].push_back(x);
            }
        }
        ;i<=s;i++)
         if(!dad[i])
          {dfs(i);dfs1(i);break;}
        m=read();
        ;i<=m;i++)
        {
            x=read(),y=read();
            ans[lca(x,y)]++;
        }
        ;i<=s;i++)
         if(ans[i]) printf("%d:%d\n",i,ans[i]);
    }
    ;
}

poj——1470 Closest Common Ancestors的更多相关文章

  1. POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)

    POJ 1470 Closest Common Ancestors(最近公共祖先 LCA) Description Write a program that takes as input a root ...

  2. POJ 1470 Closest Common Ancestors 【LCA】

    任意门:http://poj.org/problem?id=1470 Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000 ...

  3. POJ 1470 Closest Common Ancestors (LCA,离线Tarjan算法)

    Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 13372   Accept ...

  4. POJ 1470 Closest Common Ancestors

    传送门 Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 17306   Ac ...

  5. POJ 1470 Closest Common Ancestors (LCA, dfs+ST在线算法)

    Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 13370   Accept ...

  6. poj 1470 Closest Common Ancestors LCA

    题目链接:http://poj.org/problem?id=1470 Write a program that takes as input a rooted tree and a list of ...

  7. POJ - 1470 Closest Common Ancestors(离线Tarjan算法)

    1.输出测试用例中是最近公共祖先的节点,以及这个节点作为最近公共祖先的次数. 2.最近公共祖先,离线Tarjan算法 3. /* POJ 1470 给出一颗有向树,Q个查询 输出查询结果中每个点出现次 ...

  8. POJ 1470 Closest Common Ancestors【近期公共祖先LCA】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/35311489 题目链接:http://poj ...

  9. POJ 1470 Closest Common Ancestors【LCA Tarjan】

    题目链接: http://poj.org/problem?id=1470 题意: 给定若干有向边,构成有根数,给定若干查询,求每个查询的结点的LCA出现次数. 分析: 还是很裸的tarjan的LCA. ...

随机推荐

  1. 浅析套接字中SO_REUSEPORT和SO_REUSEADDR的区别

    Socket的基本背景 在讨论这两个选项的区别时,我们需要知道的是BSD实现是所有socket实现的起源.基本上其他所有的系统某种程度上都参考了BSD socket实现(或者至少是其接口),然后开始了 ...

  2. Android开发-下载网络图片并显示到本地

    Android下载网络图片的流程是: 发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件. 注意点 最新的Android系统不可以在主线程上请求 ...

  3. windows echo命令

    ECHO命令是大家都熟悉的DOS批处理命令的一条子命令,但它的一些功能和用法也许你并不是全都知道,不信你瞧:  1. 作为控制批处理命令在执行时是否显示命令行自身的开关 格式:ECHO [ON|OFF ...

  4. Mac下Eclipse/adb无法调试MX5手机

    前提是环境已经配置好,其他手机可以连接但MX系列不可以 解决方法:打开终端 echo 0x2a45 >> ~/.android/adb_usb.ini adb kill-server ad ...

  5. ZooKeeper系列(四)

    一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公共的部分.简单地说,ZooKeeper可以作为一个具有高可用性的配置存储器,允许分布式应用的参与者检索和 ...

  6. Importing Swift into Objective-C

    Overview You can work with types declared in Swift from within the Objective-C code in your project ...

  7. Python之三元运算、集合、函数

    一.三元运算符 三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值 格式:[on_true] if [expression] else [on_false] res = 值1 if 条件 els ...

  8. SQLServer锁的概述

    SQLServer锁的概述   锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了 ...

  9. jq进度条

    <!doctype html><html><head><meta charset="utf-8"><title>JQue ...

  10. 51nod 1057 n的阶乘 (压位优化)

    题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1057&judgeId=605203 使用压位进行优化, ...