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 ...
随机推荐
- Gentoo安装详解(五)-- 安装X桌面环境
安装X桌面环境: 安装Xorg: 检测显卡信息: dmesg | grep video lspci | grep -i VGA 配置INPUT_DEVICE.VIDEO_CARDS变量: 在安装Xor ...
- insertMany
结果:
- C - 娜娜梦游仙境系列——吃不完的糖果
C - 娜娜梦游仙境系列——吃不完的糖果 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Oth ...
- 利用Ajax实现前端与.net后端实现数据交互
使用场景和需求:用户在地址栏输入请求地址,先.net服务器发送页面请求,该页面包含Echart图表,在页面中向.net后端发送数据请求,获取数据后,将数据填充到Echart图表中.其中包含带参与不带参 ...
- MFC创建动态链接库DLL并调用方法详解
实例一: 1.创建一个动态链接库工程,如login_dll. 2.在原工程头文件或者新建头文件如showdlg.h定义动态链接库的导出函数,代码如下: #include "stdafx.h& ...
- HDU2673:shǎ崽 OrOrOrOrz
Problem Description Acmer in HDU-ACM team are ambitious, especially shǎ崽, he can spend time in Inter ...
- centos 命令行 连接无线网卡
ifconfig wlan0 up 1 ifconfig wlan0 iwlist wlan0 scan wpa_passphrase naizhongnai naizhong >> /e ...
- laravel使用多个数据库连接
1.配置.env文件 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=database_name DB_USERNAME= ...
- Oracle record 解锁
Oracle修改表中记录时出现record is locked by another user的弹出框问题 是因为在操作表中数据时没有commit,导致表被锁. 执行下面两行语句: (1)查看被锁表的 ...
- Androidndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)
很多朋友在开发Android JNI的的时候,会遇到findlibrary returned null的错误,因为某种原因,so没有打包到apk中.下面浅析下引起该错误的原因以及平台兼容性问题. 一. ...