POJ 1470 Closest Common Ancestors(LCA 最近公共祖先)
其实这是一个裸求LCA的题目,我使用的是离线的Tarjan算法,但是这个题的AC对于我来说却很坎坷……首先是RE,我立马想到数组开小了,然后扩大了数组,MLE了……接着把数组调整适当大小,又交了一发,嗯?居然WA了,一定是我姿势不对,我换个编译器交一下,结果还是WA……这就比较尴尬了,最后审题目,发现了,我以为第一个输入的点就是根节点,其实不是,我们还需要找到入度为0的点来处理,这里做一个标记就可以了。还有就是题目的输入稍微有点坑,尤其是第二次输入,题目中说忽略所有空白,这就需要比较好的处理方法了,我采用的是while的方法,当然方法肯定是有很多的。代码如下:
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
#define N 1010
int head[N],qhead[N],n,tot,qtot;
struct Edge{
int to,nxt;
}edge[N*N];
void addedge(int a,int b){
edge[tot].to = b;
edge[tot].nxt = head[a];
head[a] = tot++;
}
Edge query[N*N];
void addquery(int a,int b){
query[qtot].to = b;
query[qtot].nxt = qhead[a];
qhead[a] = qtot++;
}
int vis[N],fa[N],ans[N];
int Find(int x){
return x == fa[x] ? fa[x] : fa[x] = Find(fa[x]);
}
void tarjan(int u){
vis[u] = ;
fa[u] = u;
int v,LCA;
for(int i = qhead[u];i != -;i = query[i].nxt){
v = query[i].to;
if(vis[v]){
LCA = Find(v);
//printf("%d->%d LCA = %d\n",u,v,LCA);
ans[LCA]++;
}
}
for(int i = head[u];i != -;i = edge[i].nxt){
v = edge[i].to;
if(!vis[v]){
tarjan(v);
fa[v] = u;
}
}
return ;
}
int main(){
int a,b,m,num,anc,mark[N];
while(~scanf("%d",&n)){
tot = ;
memset(head,-,sizeof(head));
memset(mark,,sizeof(mark));
for(int i = ;i <= n;i++){
scanf("%d:(%d) ",&a,&num);
for(int j = ;j < num;j++){
scanf("%d",&b);
mark[b] = ;
addedge(a,b);
}
// for(int j = head[a];j != -1;j = edge[j].nxt){
// printf("%d->%d\n",a,edge[j].to);
// }
fa[i] = i;
}
for(int i = ;i <= n;i++){
if(!mark[i]){
anc = i;
break;
}
}
memset(qhead,-,sizeof(qhead));
qtot = ;
scanf("%d",&m);
// getchar();
char ch; int cnt = ;
while(~scanf("%c",&ch)){
if(ch == '('){
scanf("%d %d)",&a,&b);
addquery(a,b);
addquery(b,a);
cnt++;
}
if(cnt==m) break;
}
memset(vis,,sizeof(vis));
memset(ans,,sizeof(ans));
tarjan(anc);
for(int i = ;i <= n;i++){
if(ans[i]) printf("%d:%d\n",i,ans[i]);
}
}
return ;
}
POJ 1470 Closest Common Ancestors(LCA 最近公共祖先)的更多相关文章
- 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】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/35311489 题目链接:http://poj ...
- POJ 1470 Closest Common Ancestors (最近公共祖先LCA 的离线算法Tarjan)
Tarjan算法的详细介绍,请戳: http://www.cnblogs.com/chenxiwenruo/p/3529533.html #include <iostream> #incl ...
- 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 ...
- POJ 1470 Closest Common Ancestors(LCA&RMQ)
题意比较费劲:输入看起来很麻烦.处理括号冒号的时候是用%1s就可以.还有就是注意它有根节点...Q次查询 在线st算法 /*************************************** ...
- POJ 1470 Closest Common Ancestors LCA题解
本题也是找LCA的题目,只是要求多次查询.一般的暴力查询就必定超时了,故此必须使用更高级的方法,这里使用Tarjan算法. 本题处理Tarjan算法,似乎输入处理也挺麻烦的. 注意: 由于查询的数据会 ...
- 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, dfs+ST在线算法)
Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 13370 Accept ...
随机推荐
- Openjudge-计算概论(A)-统计字符数
描述: 判断一个由a-z这26个字符组成的字符串中哪个字符出现的次数最多输入第1行是测试数据的组数n,每组测试数据占1行,是一个由a-z这26个字符组成的字符串每组测试数据之间有一个空行,每行数据不超 ...
- Openjudge-计算概论(A)-比饭量
描述: 3个人比饭量,每人说了两句话: A说:B比我吃的多,C和我吃的一样多 B说:A比我吃的多,A也比C吃的多 C说:我比B吃得多,B比A吃的多. 事实上,饭量和正确断言的个数是反序的关系. 请编程 ...
- Objective-C中关于请求返回NSData数据解析成NSDictionary或NSArray的方法
1.如果后台返回的是字典或数组的data型,直接使用以下方法转换: { // Data 转成 字典 其中responseObject为返回的data数据 NSDictionary *resultDic ...
- iOS动画编程
IOS中的动画总结来说有五种:UIView<block>,CAAnimation<CABasicAnimation,CATransition,CAKeyframeAnimation& ...
- F - 娜娜梦游仙境系列——多民族王国
F - 娜娜梦游仙境系列——多民族王国 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Othe ...
- 安装jar包到本地maven仓库
1.打开cmd 直接输入一下命令 自己下载的jar包放在d盘根目录下,jar名字叫spring-context-support-3.1.0.RELEASE.jar DgroupId后面写的是group ...
- 搭建Linux3.4.2内核编辑环境
(1)准备工作:1. 准备虚拟机2.安装工具链sudo tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C /设置环境变量:sudo vi /etc/environment ...
- Emacs阅读chm文档
.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium ...
- WINDOWS特有的消息常量标识符
'========================================'WINDOWS特有的消息常量标识符'======================================== ...
- 用sqlyog远程连接LINUX系统的MYSQL出现错解决方法
无法给远程连接的用户权限问题.结果这样子操作mysql库,即可解决.在本机登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称'%' ...