http://poj.org/problem?id=1470

Time Limit: 2000MS   Memory Limit: 10000K
Total Submissions: 20830   Accepted: 6617

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

 
LCA ,,(多组数据、)
 #include <algorithm>
#include <cstring>
#include <cstdio> using namespace std; const int N(2e5+);
int n,m,cnt;
int ans[N]; int head[N],sumedge;
struct Edge
{
int v,next;
Edge(int v=,int next=):
v(v),next(next){}
}edge[N<<];
inline void ins(int u,int v)
{
edge[++sumedge]=Edge(v,head[u]);
head[u]=sumedge;
} int son[N],size[N],deep[N],top[N],dad[N],fa[N];
void DFS(int u,int fa,int deepth)
{
size[u]=;
dad[u]=fa;
deep[u]=deepth;
for(int v,i=head[u];i;i=edge[i].next)
{
v=edge[i].v;
if(dad[u]==v) continue;
DFS(v,u,deepth+);
size[u]+=size[v];
if(size[son[u]]<size[v]) son[u]=v;
}
}
void DFS_(int u,int Top)
{
top[u]=Top;
if(son[u]) DFS_(son[u],Top);
for(int v,i=head[u];i;i=edge[i].next)
{
v=edge[i].v;
if(dad[u]!=v&&son[u]!=v) DFS_(v,v);
}
}
int LCA(int x,int y)
{
for(;top[x]!=top[y];x=dad[top[x]])
if(deep[top[x]]<deep[top[y]]) swap(x,y);
return deep[x]<deep[y]?x:y;
} inline void init()
{
sumedge=;
memset(fa,,sizeof(fa));
memset(dad,,sizeof(dad));
memset(top,,sizeof(top));
memset(son,,sizeof(son));
memset(ans,,sizeof(ans));
memset(size,,sizeof(size));
memset(head,,sizeof(head));
memset(edge,,sizeof(edge));
memset(deep,,sizeof(deep));
} inline void read(int &x)
{
x=;register char ch=getchar();
for(;ch<''||ch>'';) ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-'';
} int main()
{
for(int t;~scanf("%d",&t);init())
{
n=t;
for(int u,v,nn;t--;)
{
read(u);
read(nn);
for(int i=;i<=nn;i++)
{
read(v);
fa[v]=u;
ins(u,v);
ins(v,u);
}
}
int root=;
for(;root<=n;root++)
if(!fa[root]) break;
DFS(root,,);
DFS_(root,root);
read(m);
for(int u,v;m--;)
{
read(u),read(v);
ans[LCA(u,v)]++;
}
for(int i=;i<=n;i++)
if(ans[i]) printf("%d:%d\n",i,ans[i]);
}
return ;
}

最新文章

  1. jcl-over-slf4j log桥接工具简介
  2. viso2010从mysql中导出ER图
  3. uploadify 报错集锦
  4. SpringMVC 配置定时执行任务
  5. 安卓开发21:深入理解Handler
  6. 初用jquery
  7. hdu 4135 Co-prime(容斥)
  8. IOS 怎么修改Navigation Bar上的返回按钮文本颜色,箭头颜色以及导航栏按钮的颜色
  9. Nuget升级问题
  10. CMap与hash_map效率对照
  11. Centos 7.3 安装配置 PostgreSQL 9.x
  12. 【Python】 virtualenv虚拟环境建设和管理
  13. Swing中经常会遇到的若干问题——JTable(持续更新)
  14. C++实现双链表
  15. 使用xUnit为.net core程序进行单元测试 -- Assert
  16. 2018年终总结之AI领域开源框架汇总
  17. Flutter采坑之路 用真机跑起来的时候提示 initGradle失败,IO异常,downloading Gradle-4.6-all.zip失败
  18. LeetCode刷题:第一题 两数之和
  19. vue数据双向绑定
  20. mysql installer gentask怎么关闭

热门文章

  1. HTML基础——网站信息显示页面
  2. activity的23张表
  3. php如何实现文件下载
  4. Ncomputering 安装及参数设置
  5. C指针思考-(1)
  6. docker-ce-17.03.2 离线安装RPM包
  7. vue项目打包后想发布在apache www/vue 目录下
  8. 安装xcode6 beta 后调试出现Unable to boot the iOS Simulator以及编译苹果官方Swift的demo报错failed with exit code 1的解决的方法
  9. Compile OpenCASCADE7.3 with VS2008
  10. POJ 1012 Joseph(打表题)