以poj1330为例子
给出T颗有根树,询问u,v的lca
跳~跳~跳~lca
#include<cmath>
#include<queue>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 10001
int n,m;
int w[MAXN];
struct node
{
int u,v,next;
} E[MAXN];
int head[MAXN],tot;
void add(int u,int v)
{
E[++tot].u=u,E[tot].v=v,E[tot].next=head[u],head[u]=tot;
}
int fa[20][MAXN];
int vis[MAXN],dep[MAXN],r[MAXN];
void dfs(int u)
{
vis[u]=1;
for(int i=head[u]; i; i=E[i].next)
{
int v=E[i].v;
if(vis[v]==0)
{
dep[v]=dep[u]+1;
fa[0][v]=u;
dfs(v);
}
}
}
void st()
{
for(int j=1; j<20; j++)
for(int i=1; i<=n; i++)
{
fa[j][i]=fa[j-1][fa[j-1][i]];
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=19; i>=0; i--)
if(dep[fa[i][x]]>=dep[y])
x=fa[i][x];
if(x==y)return x;
for(int i=19; i>=0; i--)
if(fa[i][x]!=fa[i][y])
{
x=fa[i][x];
y=fa[i][y];
}
return fa[0][x];
}
void clean()
{
memset(E,0,sizeof(E));
memset(head,0,sizeof(head));
memset(dep,0,sizeof(dep));
memset(fa,0,sizeof(fa));
memset(r,0,sizeof(r));
memset(vis,0,sizeof(vis));
tot=0;
}
void init(int root)
{
fa[0][root]=root;
dfs(root);
st();
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
clean();
int u,v;
for(int i=1; i<n; i++)
{
scanf("%d%d",&u,&v);
add(u,v);
r[v]++;
}
int root;
for(int i=1;i<=n;i++)if(r[i]==0)root=i;
init(root);
scanf("%d%d",&u,&v);
printf("%d\n",lca(u,v));
}
return 0;
}
跳~跳~跳~lca
跳~跳~跳~lca
跳~跳~跳~lca