您的位置:首页 > 其它

poj 1330 Nearest Common Ancestors

2016-07-08 17:20 253 查看
题目大意

  自己读~~真~题目大意

分析

  就是裸的LCA tarjan离线算法,套模板。

代码

type
arr=record
x,y,w:longint;
next:longint;
end;

var
a,g:array[1..10010] of arr;
fa,v,v1:array[1..10010] of longint;
dis:array[1..10010] of int64;
ls,ls1:array[1..10010] of longint;
nm,nm1:longint;
n,m:longint;
i,j,k,l,z:longint;
ans,ans2:int64;

procedure add(x,y:longint);
begin
nm:=nm+1;
a[nm].x:=x;
a[nm].y:=y;
//a[nm].w:=w;
a[nm].next:=ls[x];
ls[x]:=nm;
end;

function find(x:longint):longint;
begin
if fa[x]=x
then exit(x)
else
begin
find:=find(fa[x]);
fa[x]:=find;
end;
end;

procedure union(x,y:longint);
var
i,j:longint;
begin
i:=find(x); j:=find(y);
fa[i]:=j;
end;

procedure dfs(r:longint);
var
i,j,k:longint;
begin
i:=ls[r];
while i<>0 do
begin
with a[i] do
begin
dfs(y);
union(y,x);
v[y]:=1;
i:=next;
end;
end;
i:=ls1[r];
while i<>0 do
begin
with g[i] do
begin
if v[y]=1
then
{if find(y)=x
then
begin
ans:=ans+1;
ans2:=ans2+dis[y]-dis[x];
end;                        }
writeln(find(y));
i:=next;
end;
end;
end;

procedure di(r:longint);
var
i,j,k:longint;
begin
i:=ls[r];
while i<>0 do
with a[i] do
begin
dis[y]:=dis[x]+w;
di(y);
i:=next;
end;
end;

begin
readln(m);
for z:=1 to m do begin
fillchar(ls,sizeof(ls),0);
fillchar(ls1,sizeof(ls1),0);
nm:=0; nm1:=0;
fillchar(v,sizeof(v),0);
fillchar(v1,sizeof(v1),0);
readln(n);
for i:=1 to n-1 do
begin
readln(j,k);
add(j,k);
v1[k]:=1;
end;
di(1);
for i:=1 to 1 do
begin
readln(j,k);
nm1:=nm1+1;
g[nm1].x:=j;
g[nm1].y:=k;
g[nm1].next:=ls1[j];
ls1[j]:=nm1;
nm1:=nm1+1;
g[nm1].x:=k;
g[nm1].y:=j;
g[nm1].next:=ls1[k];
ls1[k]:=nm1;
end;
for i:=1 to n do
fa[i]:=i;
for i:=1 to n do
if v1[i]=0 then dfs(i);
{writeln(ans);
writeln(ans2);}
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: