LCA(RMQ)

const lx=100004;
      xh=27;
var    L,p,nt:array[0..lx*2] of longint;
    lt,dfn,fr,dep:array[0..lx] of longint;
    f:array[0..lx*2,0..xh] of longint;
    vis:array[0..lx] of boolean;
    i,x,y,n,sum,q:longint;
procedure swap(var a,b:longint);
var c:longint;
begin
    c:=a; a:=b; b:=c;
end;
procedure dfs(u:longint);
var i,v:longint;
begin
    inc(sum); dfn[u]:=sum; vis[u]:=true;
    inc(L[0]); L[L[0]]:=u;
    fr[u]:=L[0];
    i:=lt[u];
    while i<>0 do
    begin
        v:=p[i];
        if not vis[v] then
        begin
            dep[v]:=dep[u]+1;
            dfs(v);
            inc(L[0]); L[L[0]]:=u;
        end;
        i:=nt[i];
    end;
end;
procedure prepare;
var i,j:longint;
begin
    fillchar(fr,sizeof(fr),0);
    fillchar(vis,sizeof(vis),false);
    fillchar(L,sizeof(L),0);
    sum:=0;
        dep[1]:=1;
    dfs(1);
    for i:=1 to L[0] do f[i,0]:=L[i];
    for i:=1 to xh do
        for j:=1 to L[0] do
            if j+1<<i-1<=L[0] then
                if dfn[f[j,i-1]]<dfn[f[j+1<<(i-1),i-1]] then f[j,i]:=f[j,i-1]
                    else f[j,i]:=f[j+1<<(i-1),i-1];
end;
procedure add(x,y:longint);
begin
    inc(sum); p[sum]:=y; nt[sum]:=lt[x]; lt[x]:=sum;
end;
function find(s,t:longint):longint;
var k:longint;
begin
    s:=fr[s]; t:=fr[t];
    if s>t then swap(s,t);
    k:=trunc(ln(t-s+1)/ln(2));
    if dfn[f[s,k]]<dfn[f[t-1<<k+1,k]] then exit(f[s,k]) else exit(f[t-1<<k+1,k]);
end;
function dis(s,t:longint):longint;
var k:longint;
begin
    k:=find(s,t);
    exit(dep[t]-dep[k]+dep[s]-dep[k]);
end;
begin
    readln(n);
    fillchar(lt,sizeof(lt),0);
    sum:=0;
    for i:=1 to n-1 do
    begin
        readln(x,y);
        add(x,y);
        add(y,x);
    end;
    prepare;

end.

 

posted @ 2015-03-23 08:52  rpSebastian  阅读(165)  评论(0编辑  收藏  举报