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;
}
题目
思路:
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;
}
相关文章推荐
- POJ1330:Nearest Common Ancestors(LCA + Tarjan离线处理)
- poj--1330 Nearest Common Ancestors(LCA/Tarjan)
- POJ 1330 Nearest Common Ancestors(Tarjan离线LCA)
- POJ 1330 Nearest Common Ancestors(LCA Tarjan)
- 【LCA|Tarjan】POJ-1330 Nearest Common Ancestors
- POJ 1330 Nearest Common Ancestors(Tarjan离线LCA)
- poj 1330 Nearest Common Ancestors (LCA) tarjan离线算法
- [POJ1330]Nearest Common Ancestors(LCA, 离线tarjan)
- POJ 1330 Nearest Common Ancestors 【用Tarjan求LCA】
- POJ 1330 Nearest Common Ancestors LCA(在线RMQ,离线Tarjan)
- POJ 1330 Nearest Common Ancestors【LCA_(rmq 在线 + tarjan 离线)】
- poj1330 Nearest Common Ancestors LCA Tarjan 待补完
- POJ 1330 Nearest Common Ancestors(tarjan LCA 算法)
- POJ1330 Nearest Common Ancestors【最近公共祖先】【Tarjan-LCA算法】
- POJ 1330 Nearest Common Ancestors(tarjan , 倍增法求LCA) - from lanshui_Yang
- [POJ 1330]Nearest Common Ancestors(LCA最近公共祖先)
- poj 1330 Nearest Common Ancestors(LCA)
- POJ 1330(Nearest Common Ancestors-Lca模板题)
- poj 1330 Nearest Common Ancestors 裸的LCA
- POJ 1330 Nearest Common Ancestors (LCA)