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. js插件之Ocupload

    使用方法: var myUpload = $(element).upload({ name: 'file', action: '', enctype: 'multipart/form-data', p ...

  2. Android EditText 输入金额(小数点后两位)

    EditText edit = new EditText(context); InputType.TYPE_NUMBER_FLAG_DECIMAL //小数点型 InputType.TYPE_CLAS ...

  3. web页面打印--铺满A4

    css <style type="text/css"> body { margin: 0; padding: 0; background-color: #FAFAFA; ...

  4. .NET Core MVC Web最最最基础的框架搭建

    1. 使用VS创建.NET Core MVC Web项目 创建完成就是酱紫的了 2. 用NuGet把这些全部都安装了 Install-Package Microsoft.EntityFramework ...

  5. 洛谷——P2680 运输计划

    https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...

  6. com口操作excel

    _Application app;       //Excel应用程序接口 Workbooks books;        //工作薄集合 _Workbook book;     //工作薄 Work ...

  7. 【HTML5】可以省略标记的元素

  8. Js获取操作系统版本 && 获得浏览器版本

    //利用原生Js获取操作系统版本function getOS() { var sUserAgent = navigator.userAgent; var isWin = (navigator.plat ...

  9. thinkphp5中vendor的使用?

    1.创建处理数组的类ArrayList.php <?php /** * ArrayList实现类 * @author liu21st <liu21st@gmail.com> */ c ...

  10. python3+beautifulSoup4.6抓取某网站小说(二)基础功能设计

    本章学习内容:1.网页编码还原读取2.功能设计 stuep1:网页编码还原读取 本次抓取对象: http://www.cuiweijuxs.com/jingpinxiaoshuo/ 按照第一篇的代码来 ...