其实这是一个裸求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 最近公共祖先)的更多相关文章

  1. POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)

    POJ 1470 Closest Common Ancestors(最近公共祖先 LCA) Description Write a program that takes as input a root ...

  2. POJ 1470 Closest Common Ancestors【近期公共祖先LCA】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/35311489 题目链接:http://poj ...

  3. POJ 1470 Closest Common Ancestors (最近公共祖先LCA 的离线算法Tarjan)

    Tarjan算法的详细介绍,请戳: http://www.cnblogs.com/chenxiwenruo/p/3529533.html #include <iostream> #incl ...

  4. 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 ...

  5. POJ 1470 Closest Common Ancestors(LCA&RMQ)

    题意比较费劲:输入看起来很麻烦.处理括号冒号的时候是用%1s就可以.还有就是注意它有根节点...Q次查询 在线st算法 /*************************************** ...

  6. POJ 1470 Closest Common Ancestors LCA题解

    本题也是找LCA的题目,只是要求多次查询.一般的暴力查询就必定超时了,故此必须使用更高级的方法,这里使用Tarjan算法. 本题处理Tarjan算法,似乎输入处理也挺麻烦的. 注意: 由于查询的数据会 ...

  7. POJ 1470 Closest Common Ancestors 【LCA】

    任意门:http://poj.org/problem?id=1470 Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000 ...

  8. POJ 1470 Closest Common Ancestors (LCA,离线Tarjan算法)

    Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 13372   Accept ...

  9. POJ 1470 Closest Common Ancestors (LCA, dfs+ST在线算法)

    Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 13370   Accept ...

随机推荐

  1. CodeForces 605A Sorting Railway Cars 思维

    早起一水…… 题意看着和蓝桥杯B组的大题第二道貌似一个意思…… 不过还是有亮瞎双眼的超短代码…… 总的意思呢…… 就是最长增长子序列且增长差距为1的的…… 然后n-最大长度…… 这都怎么想的…… 希望 ...

  2. 第二次冲刺spring会议(第二次会议)

    [例会时间]2014/5/5 21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳奇 界面的一些修改如下

  3. erlang dets

    1.dets表包含set.bag.和duplicate bag 2.dets:open_file(TableName,Options)创建或打开表 3.Options 1){auto_save,Int ...

  4. 数据库 mysql 语句

    LAMP: Linux系统 A阿帕奇服务器 Mysql数据库 Php语言 mysql:常用代码 create table CeShi1( Uid varchar(50) primary key, Pw ...

  5. HDU3371--Connect the Cities(最小生成树)

    Problem Description In 2100, since the sea level rise, most of the cities disappear. Though some sur ...

  6. HDU 5826 physics

    该问题和xi,di均无关,碰撞只会使得速度反向,大小不会变.因此只要计算速度. #pragma comment(linker, "/STACK:1024000000,1024000000&q ...

  7. DOM操作-根据name获取网页中的全部复选框

    描述: 与id不同,多个元素可以使用相同的name属性,如果需要获取这一类元素的DOM对象,就需要使用getElementsByName()函数 代码: <!DOCTYPE html> & ...

  8. JavaScript join() 方法

    http://www.w3school.com.cn/jsref/jsref_shift.asp JavaScript Array 对象 定义和用法 join() 方法用于把数组中的所有元素放入一个字 ...

  9. Software Version

    Software Version Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) To ...

  10. Java程序输出打字

    代码: 效果: