码迷,mamicode.com
首页 > 其他好文 > 详细

在线LCA

时间:2015-04-08 18:10:41      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

const int MAXN = 10010;  
const int MAXM = 10010;  
  
struct N  
{  
    int v,w,next;  
}edge[MAXM*2];  
int Top;  
int head[MAXN];  
int MAXSIZE;  
int dep[MAXN];  
int seq[MAXN*2];  
int R[MAXN];  
  
struct ST  
{  
    int dep,point;  
    bool operator < (const ST &A) const  
    {  
        return dep < A.dep;  
    }  
}st[MAXN*8];  
  //若为无向图则w = 1。
void Link(int u,int v,int w)  
{  
    edge[Top].v = v;  
    edge[Top].w = w;  
    edge[Top].next = head[u];  
    head[u] = Top++;  
}  
  
void Init()  
{  
    memset(head,-1,sizeof(head));  
    Top = 0;  
    MAXSIZE = 0;  
}  
  
void InitDep(int s,int pre = -1,int d = 0)  
{  
    R[s] = ++MAXSIZE;  
    seq[MAXSIZE] = s;  
    dep[s] = d;  
  
    for(int p =  head[s]; p != -1; p = edge[p].next)  
    {  
        if(edge[p].v != pre)  
        {  
            InitDep(edge[p].v,s,d+edge[p].w);  
            seq[++MAXSIZE] = s;  
        }  
    }  
}  
  
void InitST(int site,int l,int r)  
{  
    if(l == r)  
    {  
        st[site].dep = dep[seq[l]];  
        st[site].point = seq[l];  
        return ;  
    }  
  
    int mid = (l+r)>>1;  
  
    InitST(site<<1,l,mid);  
    InitST(site<<1|1,mid+1,r);  
  
    st[site] = st[site<<1].dep < st[site<<1|1].dep ? st[site<<1] : st[site<<1|1];  
}  
  
ST QueryLCA(int site,int L,int R,int l,int r)  
{  
    if(L == l && R == r)  
        return st[site];  
  
    int mid = (L+R)>>1;  
  
    if(r <= mid)  
        return QueryLCA(site<<1,L,mid,l,r);  
    else if(mid < l)  
        return QueryLCA(site<<1|1,mid+1,R,l,r);  
  
    return min(QueryLCA(site<<1,L,mid,l,mid),QueryLCA(site<<1|1,mid+1,R,mid+1,r));  
  
} 

在线LCA

标签:

原文地址:http://blog.csdn.net/zmx354/article/details/44943225

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!