【LCA/tarjan】POJ1470-Closest Common Ancestors
【题意】
给出一棵树和多组查询,求以每个节点为LCA的查询数有多少?
【错误点】
①读入的时候,注意它的空格是随意的呀!一开始不知道怎么弄,后来看了DISCUSS区大神的话:
询问部分输入:
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf(" (%d %d)",&a,&b);
}注意scanf(" 这里有一个空格
②多组数据啊!注意这句话:
The input file contents several data sets (at least one).
③痛心疾首!它问的是以每个节点为LCA的查询数,所以查询可以重复,同样的查询可以累计!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int MAXN=+;
vector<int> E[MAXN];
int query[MAXN][MAXN];
int cnt[MAXN];
int notrt[MAXN],rt;
int ance[MAXN];
int vis[MAXN];
int m;//结点的总个数 int find(int u)
{
int r=u;
while (ance[r]!=r) r=ance[r];
int ans=r;
r=u;
while (ance[r]!=r)
{
int tmp=ance[r];
ance[r]=ans;
r=tmp;
}
return ans;
} void tarjan(int u)
{
vis[u]=;
for (int v=;v<=m;v++)
{
if (!query[u][v]) continue;
if (vis[v])
//被访问过有两种情况:一是祖先靠左的子树中的后代;或者是自己的祖先。两者的LCA均为v所在并查集的根
{
int LCA=find(v);
cnt[LCA]+=query[u][v];
//注意,允许同样的查询出现多次,并且同样的查询可以累计!
}
} ance[u]=u;
for (int i=;i<E[u].size();i++)
{
int v=E[u][i];
tarjan(v);
ance[v]=u;
}
} void init()
{
memset(query,,sizeof(query));
memset(cnt,,sizeof(cnt));
memset(notrt,,sizeof(notrt));
memset(vis,,sizeof(vis));
for (int i=;i<=m;i++) E[i].clear();
for (int i=;i<m;i++)
{
int p,T;
scanf("%d:(%d)",&p,&T);
for (int i=;i<T;i++)
{
int son;
scanf(" %d",&son);
E[p].push_back(son);
notrt[son]++;
}
} int n;
scanf("%d",&n);
for (int i=; i<n; i++)
{
int a,b;
scanf(" (%d %d)",&a,&b);
//注意这里(前面要有一个空格!否则无法过!
query[a][b]++;
query[b][a]++;
} for (int i=;i<=m;i++) if (!notrt[i])
{
rt=i;
break;
}
} void print()
{
for (int i=;i<=m;i++)
if (cnt[i]>)
cout<<i<<':'<<cnt[i]<<endl;
} int main()
{
while (~scanf("%d",&m))
//注意是多组数据
{
init();
tarjan(rt);
print();
}
return ;
}
【LCA/tarjan】POJ1470-Closest Common Ancestors的更多相关文章
- poj1470 Closest Common Ancestors [ 离线LCA tarjan ]
传送门 Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 14915 Ac ...
- POJ1470 Closest Common Ancestors 【Tarjan的LCA】
非常裸的模版题,只是Tarjan要好好多拿出来玩味几次 非常有点巧妙呢,tarjan,大概就是当前结点和它儿子结点的羁绊 WA了俩小时,,,原因是,这个题是多数据的(还没告诉你T,用scanf!=EO ...
- POJ 1470 Closest Common Ancestors【LCA Tarjan】
题目链接: http://poj.org/problem?id=1470 题意: 给定若干有向边,构成有根数,给定若干查询,求每个查询的结点的LCA出现次数. 分析: 还是很裸的tarjan的LCA. ...
- POJ1470 Closest Common Ancestors
LCA问题,用了离线的tarjan算法.输入输出参考了博客http://www.cnblogs.com/rainydays/archive/2011/06/20/2085503.htmltarjan算 ...
- POJ 1470 Closest Common Ancestors 【LCA】
任意门:http://poj.org/problem?id=1470 Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000 ...
- 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)
POJ 1470 Closest Common Ancestors(最近公共祖先 LCA) Description Write a program that takes as input a root ...
- 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)
Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 15446 Accept ...
随机推荐
- 2018中国科大自主测试-B卷部分试题
数学部分 z = e^{\frac{2i\pi}{3}}, 求z^{2018}. \sin(2x) = \frac 35, 求\frac{\tan(x+15^{\circ})}{\tan(x-15^{ ...
- php常用表单验证类用法实例
<?php /** * 页面作用:常用表单验证类 * 作 者:欣然随风 * QQ:276624915 */ class class_post { //验证是否为指定长度的字母/数字组合 func ...
- 用VIM查看编辑二进制文件
用VIM查看编辑二进制文件 vim可以很方便地编辑二进制文件,个人认为它比emacs的二进制编辑方式更好用.vim中二进制文件的编辑是先通过外部程序xxd来把文件dump成其二进制的文本形式,然后就可 ...
- 华东师范大学第十届ECNU Coder程序设计竞赛
华东师范大学第十届ECNU Coder程序设计竞赛 浮点数模运算 solution 转成整数然后取模. 时间复杂度:\(O(1)\) 数螃蟹 solution 找出公差出现次数最多的作为公差,然后找出 ...
- Python 中的闭包与装饰器
闭包(closure)是函数式编程的重要的语法结构.闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性. 如果在一个内嵌函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内嵌函数 ...
- count(*)与count(1)、count('xxx')等在使用语法方面的区别
语法方面: 区别就是:没有区别!!! “*”号是通配符: “*”号是通配符 “*”号是通配符 使用"*"号和使用其他数字和任意非字段字符在使用方面没有任何语法错误; 至于效率方面是 ...
- salt-api起不来:ImportError('No module named wsgiserver2',)
问题:启动salt-api时没有报错但是没有端口,查看/var/log/salt/api发现如下报错: 解决方法: 下载wsgiserver2文件,放到/usr/lib64/python2.7/sit ...
- leetcode 之Permutation(七)
首先是next permutation的算法的描述和分析如下: 这题一是要知道思路,编程中注意STL的用法 void nextPermutaion(vector<int> &num ...
- tp总结
不知不觉学tp也快一个月了,虽然还处于一个仅仅只会使用的阶段,但毕竟算是我详细接触的第一个脚本框架,tp还是让我收获了许多. 废话不多说,先列出几个对于我这种新手来说tp新奇而实用的地方. 1.连贯操 ...
- POJ 1661 Help Jimmy(二维DP)
题目链接:http://poj.org/problem?id=1661 题目大意: 如图包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的 ...