[jzyzoj2021]lca模板题

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

存代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
struct nod{
    int y;
    int next;
}e[200020];
int head[100010]={};
int dep[100010]={};
int size[100010]={};
int son[100010]={};
int top[100010]={};
int f[100010]={};
int tot=0;
void init(int x,int y){
    e[++tot].next=head[x];
    head[x]=tot;
    e[tot].y=y;
}
void dfs1(int x){
    dep[x]=dep[f[x]]+1;
    size[x]=1;
    for(int i=head[x];i;i=e[i].next){
        if(e[i].y!=f[x]&&!f[e[i].y]){
            f[e[i].y]=x;
            dfs1(e[i].y);
            size[x]+=size[e[i].y];
            if(size[son[x]]<size[e[i].y]) son[x]=e[i].y;
        }
    }
}
void dfs2(int x){
    if(x==son[f[x]])top[x]=top[f[x]];
    else top[x]=x;
    for(int i=head[x];i;i=e[i].next){
        if(f[e[i].y]==x) dfs2(e[i].y);
    }
}
int ask(int x,int y){
    while(top[x]!=top[y]){
        if(dep[top[x]]>dep[top[y]]) x=f[top[x]];
        else y=f[top[y]];
    }
    if(dep[x]<dep[y]) return x;
    else return y;
}
int main(){
    scanf("%d%d",&n,&m);
    int x,y;
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        init(x,y);
        init(y,x);
    }
    dfs1(1);
    dfs2(1);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        printf("%d\n",ask(x,y));
    }
    return 0;
}
View Code

 

 
posted @ 2017-11-04 16:50  鲸头鹳  阅读(124)  评论(0编辑  收藏  举报