[jzyzoj2021]lca模板题

Posted 鲸头鹳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[jzyzoj2021]lca模板题相关的知识,希望对你有一定的参考价值。

查找最近公共祖先...我也不知道这东西有什么用,在线写法,非常之慢....

存代码
技术分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 int n,m;
 8 struct nod{
 9     int y;
10     int next;
11 }e[200020];
12 int head[100010]={};
13 int dep[100010]={};
14 int size[100010]={};
15 int son[100010]={};
16 int top[100010]={};
17 int f[100010]={};
18 int tot=0;
19 void init(int x,int y){
20     e[++tot].next=head[x];
21     head[x]=tot;
22     e[tot].y=y;
23 }
24 void dfs1(int x){
25     dep[x]=dep[f[x]]+1;
26     size[x]=1;
27     for(int i=head[x];i;i=e[i].next){
28         if(e[i].y!=f[x]&&!f[e[i].y]){
29             f[e[i].y]=x;
30             dfs1(e[i].y);
31             size[x]+=size[e[i].y];
32             if(size[son[x]]<size[e[i].y]) son[x]=e[i].y;
33         }
34     }
35 }
36 void dfs2(int x){
37     if(x==son[f[x]])top[x]=top[f[x]];
38     else top[x]=x;
39     for(int i=head[x];i;i=e[i].next){
40         if(f[e[i].y]==x) dfs2(e[i].y);
41     }
42 }
43 int ask(int x,int y){
44     while(top[x]!=top[y]){
45         if(dep[top[x]]>dep[top[y]]) x=f[top[x]];
46         else y=f[top[y]];
47     }
48     if(dep[x]<dep[y]) return x;
49     else return y;
50 }
51 int main(){
52     scanf("%d%d",&n,&m);
53     int x,y;
54     for(int i=1;i<n;i++){
55         scanf("%d%d",&x,&y);
56         init(x,y);
57         init(y,x);
58     }
59     dfs1(1);
60     dfs2(1);
61     for(int i=1;i<=m;i++){
62         scanf("%d%d",&x,&y);
63         printf("%d\n",ask(x,y));
64     }
65     return 0;
66 }
View Code

 

以上是关于[jzyzoj2021]lca模板题的主要内容,如果未能解决你的问题,请参考以下文章

LCA模板(数剖实现)

POJ 1330(LCA模板)

HDU-2586,LCA模板题

POJ 1330 Nearest Common Ancestors (模板题) (LCA)倍增

poj1986 LCA转化为RMQ在线算法模板题

poj1470(LCA模板题)