标签:lca
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 20488 | Accepted: 10785 |
Description
Input
Output
Sample Input
2 16 1 14 8 5 10 16 5 9 4 6 8 4 4 10 1 13 6 15 10 11 6 7 10 2 16 3 8 1 16 12 16 7 5 2 3 3 4 3 1 1 5 3 5
Sample Output
4 3
Source
ac代码
#include<stdio.h>
#include<string.h>
struct s
{
int u,v,next;
}edge[10010];
int vis[10010],head[10010],a,b,pre[10010],dig[10010],cnt,ans,flag,n;
void init()
{
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
memset(dig,0,sizeof(dig));
cnt=0;
flag=0;
}
void add(int u,int v)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
int find(int x)
{
if(x==pre[x])
return x;
return find(pre[x]);
}
void tarjan(int u)
{
pre[u]=u;
vis[u]=1;
if(flag)
return;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(!vis[v])
{
tarjan(v);
pre[v]=u;
}
}
if(u==a&&vis[b])
{
ans=find(b);
flag=1;
}
else
{
if(u==b&&vis[a])
{
ans=find(a);
flag=1;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,j;
init();
scanf("%d",&n);
for(i=0;i<n-1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
dig[v]++;
}
scanf("%d%d",&a,&b);
for(i=1;i<=n;i++)
{
if(dig[i]==0)
{
tarjan(i);
break;
}
}
printf("%d\n",ans);
}
}
POJ题目1330 Nearest Common Ancestors(LCA)
标签:lca
原文地址:http://blog.csdn.net/yu_ch_sh/article/details/45080997