POJ 1470 Closest Common Ancestors 【LCA】
任意门:http://poj.org/problem?id=1470
| Time Limit: 2000MS | Memory Limit: 10000K | |
| Total Submissions: 22519 | Accepted: 7137 |
Description
Input
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 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
题意概括:
给一棵 N 个结点 N-1 条边的树,和 M 次查询;
形式是:先给根结点 然后 给与这个根结点相连的 子节点。
查询的对儿给得有点放荡不羁,需要处理一下空格、回车、括号。。。
解题思路:
虽说表面上看是一道裸得 LCA 模板题(简单粗暴Tarjan)
但是细节还是要注意:
本题没有给 查询数 M 的范围(RE了两次)所以要投机取巧一下不使用记录每对查询的 LCA。
本题是多测试样例,注意初始化!!!
AC code:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int MAXN = 1e3+;
struct Edge{int v, w, nxt;}edge[MAXN<<];
struct Query
{
int v, id;
Query(){};
Query(int _v, int _id):v(_v), id(_id){};
};
vector<Query> q[MAXN]; int head[MAXN], cnt;
int fa[MAXN], ans[MAXN<<], no[MAXN];
bool vis[MAXN], in[MAXN];
int N, M; void init()
{
memset(head, -, sizeof(head));
memset(in, false, sizeof(in));
memset(vis, false, sizeof(vis));
//memset(ans, 0, sizeof(ans));
memset(no, , sizeof(no));
cnt = ;
for(int i = ; i <= N; i++)
fa[i] = i, q[i].clear();
} int getfa(int x){return fa[x]==x?x:fa[x]=getfa(fa[x]);} void AddEdge(int from, int to)
{
edge[cnt].v = to;
edge[cnt].nxt = head[from];
head[from] = cnt++;
} void Tarjan(int s, int f)
{
int root = s;
fa[s] = s;
for(int i = head[s]; i != -; i = edge[i].nxt)
{
int Eiv = edge[i].v;
if(Eiv == f) continue;
Tarjan(Eiv, s);
fa[getfa(Eiv)] = s;
}
vis[s] = true;
for(int i = ; i < q[s].size(); i++){
//if(vis[q[s][i].v]) ans[q[s][i].id] = getfa(q[s][i].v);
if(vis[q[s][i].v])
no[getfa(q[s][i].v)]++;
}
} int main()
{
while(~scanf("%d", &N)){
init();
//scanf("%d", &N);
for(int i = , u, v, k; i <= N; i++){
scanf("%d:(%d)", &u, &k);
for(int j = ; j <= k; j++){
scanf("%d", &v);
AddEdge(u, v);
in[v] = true;
}
}
int root = ;
for(int i = ; i <= N; i++) if(!in[i]){root = i;break;}
scanf("%d", &M);
int sum = , u, v;
while(sum <= M){
while(getchar()!='(');
scanf("%d%d", &u, &v);
while(getchar()!=')');
q[u].push_back(Query(v, sum));
q[v].push_back(Query(u, sum));
sum++;
}
Tarjan(root, -);
/*
for(int i = 1; i <= M; i++){
no[ans[i]]++;
}
*/ for(int i = ; i <= N; i++){
if(no[i]) printf("%d:%d\n", i, no[i]);
}
}
return ;
}
POJ 1470 Closest Common Ancestors 【LCA】的更多相关文章
- POJ 1470 Closest Common Ancestors【LCA Tarjan】
题目链接: http://poj.org/problem?id=1470 题意: 给定若干有向边,构成有根数,给定若干查询,求每个查询的结点的LCA出现次数. 分析: 还是很裸的tarjan的LCA. ...
- POJ 1470 Closest Common Ancestors (LCA,离线Tarjan算法)
Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 13372 Accept ...
- POJ 1470 Closest Common Ancestors (LCA, dfs+ST在线算法)
Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 13370 Accept ...
- POJ 1470 Closest Common Ancestors【近期公共祖先LCA】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/35311489 题目链接:http://poj ...
- POJ 1330:Nearest Common Ancestors【lca】
题目大意:唔 就是给你一棵树 和两个点,问你这两个点的LCA是什么 思路:LCA的模板题,要注意的是在并查集合并的时候并不是随意的,而是把叶子节点合到父节点上 #include<cstdio&g ...
- POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)
POJ 1470 Closest Common Ancestors(最近公共祖先 LCA) Description Write a program that takes as input a root ...
- POJ 1470 Closest Common Ancestors
传送门 Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 17306 Ac ...
- poj——1470 Closest Common Ancestors
Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 20804 Accept ...
- 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 ...
随机推荐
- 网络编程api bind函数细节 select 细节
struct sockaddr_in bindaddr; bindaddr.sin_family = AF_INET; bindaddr.sin_addr.s_addr = htonl(INADDR_ ...
- (转)Saltstack系列
Saltstack系列1:安装配置 Saltstack系列2:Saltstack远程执行命令 Saltstack系列3:Saltstack常用模块及API Saltstack系列4:Saltstack ...
- Docker的安装和镜像管理并利用Docker容器实现nginx的负载均衡、动静分离
Docker的安装 一.Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ...
- MongoDB数据库进阶 --- 增删查改...
注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 在之前的文章中,我已经介绍了什么事MongoDB以及怎么在windows下安装MongoDB等等基本知识. ...
- express遇到的问题
1. 如何引入express? cnpm install express --save 其中--save可以保存到依赖项中. 接着 var express = require("expres ...
- FZU 1921——栀子花开——————【线段树单点更新】
栀子花开 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- django基本入门
1.创建应用 2.设计模型 3.语言时区等设置 4. Templates 1.创建应用[MVT] 一个项目可以有多个应用[模块]: 这里已经创建了项目:test1 python manager.py ...
- javascript学习:闭包和prototype原型使用基础
闭包 function Person(name) { this.Username = name; var Userage = 18; //通过这种方法可以模拟私有成员 //类似于private成员 t ...
- Git读档
$ git config --global user.name "meng kai" $ git config --global user.email 363255751@qq.c ...
- struts2的基本配置
1.package标签下主要的点在namespace和name,extend上 extend 一般继承自struts-default.xml下,继承其拦截器及一些功能,这个已在本人的拦截器一文中有讲到 ...