poj 1330 LCA模版题

传送门

题意:求最近公共祖先。

思路:没啥思路

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t,n,fst[10005],next[10005],node[10005],x,y,father[10005];
bool vis[10005],rot[10005],ok;
int find(int x)
{
    if(father[x]==x)return x;
    else return find(father[x]);
}
void LCA(int u)
{
    father[u]=u;
    for(int i=fst[u];i!=-1;i=next[i])
    {
        if(ok)return;
        LCA(node[i]);
        father[node[i]]=u;
    }
    vis[u]=1;
    if(u==x&&vis[y])
    {
        printf("%d\n",find(y));
        ok=1;
    }
    else if(u==y&&vis[x])
    {
        printf("%d\n",find(x));
        ok=1;
    }
}
int main()
{
    int u,v;
    scanf("%d",&t);
    while(t--)
    {
        ok=0;
        memset(vis,0,sizeof(vis));
        memset(rot,0,sizeof(rot));
        memset(fst,-1,sizeof(fst));
        scanf("%d",&n);
        for(int i=1;i<n;i++)
        {
            scanf("%d%d",&u,&v);
            node[i]=v;
            next[i]=fst[u];
            fst[u]=i;
            rot[v]=1;
        }
        scanf("%d%d",&x,&y);
        for(int i=1;i<=n;i++)
        {
            if(!rot[i])
            {
                LCA(i);
                break;
            }
        }
    }
    return 0;
}


你可能感兴趣的:(poj,LCA,Baoge)