您的位置:首页 > 其它

targan求LCA

2017-12-10 17:47 85 查看
#include<iostream>

#include<cstdio>

#include<cstring>

#include<cctype>

using namespace std;

const int M=1000000+10;

struct edge

{

    int next,to;

}tree[M];

struct node 

{

    int next,to,index;

}que[M];

bool vis[M];

int n,m,s,a,b,ans[M],father[M];

int cnt_tree,head_tree[M],cnt_que,head_que[M];

void add_tree(int u,int v)

{

    tree[++cnt_tree].next=head_tree[u];

    tree[cnt_tree].to=v;

    head_tree[u]=cnt_tree;

}

void add_que(int u,int v,int base)

{

    que[++cnt_que].next=head_que[u];

    que[cnt_que].to=v;

    que[cnt_que].index=base;

    head_que[u]=cnt_que;

}

int find(int x)

{

    if(father[x]!=x)return father[x]=find(father[x]);

    return x;

}

void targan(int x)

{

    vis[x]=1;

    for(int i=head_tree[x];i;i=tree[i].next)

    {

        int y=tree[i].to;

        if(!vis[y])

        {

            targan(y);

            father[y]=x;

        }

    }

    for(int i=head_que[x];i;i=que[i].next)

    {

        int y=que[i].to;

        if(vis[y]);

        ans[que[i].index]=find(y);

    }

}

void read(int &a)

{

    char c=getchar();

    while(!isdigit(c)) c=getchar();

    while(isdigit(c))a=a*10+c-48,c=getchar();

}

int main()

{

    //freopen("LCA.in","r",stdin);

    //freopen("LCA>OUT","w",stdout);

    read(n),read(m),read(s);

    //printf("%d %d %d",n,m,s);

    for(int i=1;i<=n-1;++i)

    {

        read(a=0),read(b=0);

        add_tree(a,b);

        add_tree(b,a);

    }

    for(int i=1;i<=m;++i)

    {

        read(a=0),read(b=0);

        add_que(b,a,i);

        add_que(a,b,i);

    }

    for(int i=1;i<=n;++i)

        father[i]=i;

    targan(s);

    for(int i=1;i<=m;++i)

        printf("%d\n",ans[i]);

// fclose(stdin);

// fclose(stdout);

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  targan LCA