设为首页 加入收藏

TOP

LCA 算法学习 (最近公共祖先)poj 1330
2015-07-20 17:55:02 来源: 作者: 【 】 浏览:2
Tags:LCA 算法 学习 最近 公共 祖先 poj 1330

poj1330

在求解最近公共祖先为问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,处理技巧就是在回溯到结点u的时候,u的子树已经遍历,这时候才把u结点放入合并集合中,这样u结点和所有u的子树中的结点的最近公共祖先就是u了,u和还未遍历的所有u的兄弟结点及子树中的最近公共祖先就是u的父亲结点。这样我们在对树深度遍历的时候就很自然的将树中的结点分成若干的集合,两个集合中的所属不同集合的任意一对顶点的公共祖先都是相同的,也就是说这两个集合的最近公共祖先只有一个。时间复杂度为O(n+q),n为节点,q为询问节点对数。


#include"stdio.h"
#include"string.h"
#include"vector"
using namespace std;
#define N 11000
const int inf=1<<20;
vector
  
   g[N];
int s,t,n;
int f[N],pre[N],ans[N];
bool vis[N];
int findset(int x)
{
    if(x!=f[x])
        f[x]=findset(f[x]);
    return f[x];
}
int unionset(int a,int b)
{
    int x=findset(a);
    int y=findset(b);
    if(x==y)
        return x;
    f[y]=x;
    return x;
}
void lca(int u)
{
    int i,v;
    ans[u]=u;
    for(i=0;i
   
    


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 4927 Series 1 下一篇POJ 3522 Slim Span (最小生成树)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: