您的位置:首页 > 其它

POJ - 1330 Nearest Common Ancestors(LCA tarjan)

2017-06-21 23:35 405 查看
POJ1330
题目


思路:
LCA基础题,就一个询问。这里用的tarjan算法

推荐博客:大神博客

代码:

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;
const int maxn = 1e4+10;
int f[maxn], h[maxn], anc[maxn], vis[maxn], isRoot[maxn];
int ql,qr;
struct node
{
int to,next;
node(){}
node(int a,int b)
{
to = a; next = b;
}
}edge[maxn];
int edgenum = 0; int t,n;
void add(int from, int to)
{
edge[edgenum] = node(to, h[from]);
h[from] = edgenum++;
}
int getf(int i)
{
return i == f[i] ? i : f[i] = getf(f[i]);
}
int join(int i,int j)
{
int x = getf(i), y = getf(j);
if(x != y)
f[y] = x;
return 0;
}
int ans = -1;
void tarjan(int u)
{
if(~ans) return;
anc[u] = u;
for(int i = h[u]; ~i ; i = edge[i].next)
{
int v = edge[i].to;
tarjan(v);
join(u,v);

anc[ getf(u) ] = u;
}
vis[u] = 1;
if(u == ql && vis[qr])
ans = getf(qr);
else if(u == qr && vis[ql])
ans = getf(ql);
return;
}
void init()
{
edgenum = 0;
ans = -1;
for(int i = 1; i <= n; i++)
f[i] = i ,anc[i] = 0, vis[i] = 0, isRoot[i] = 0;
for(int i = 1; i <= n; i++) h[i] = -1;
}
int main()
{

scanf("%d",&t);
while(t--)
{

scanf("%d",&n);
init();
for(int i = 1; i < n ; i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
isRoot[b] ++;
}
scanf("%d%d",&ql,&qr);
int r;
for(int i = 1; i <= n; i++)
if(!isRoot[i]) r = i;
tarjan(r);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: