您的位置:首页 > 其它

POJ1330 Nearest Common Ancestors 非lca pascal 解题报告

2013-12-29 14:48 537 查看
题目大意:在T组数据中(T不知道有多大,题目没有写),每组数据的先给出一个N(2<=N<=10000),之后再数据中N-1行为边的信息,每组数据的第N行给出一个询问,然后输出他们的最小公共祖先。

一开始打算直接用lca做的,但是对比一下lca和暴力的空间和时间,感觉还是有那么一点点的差距,所以就没用lca,直接暴力。其实思路很简单,对于每一对连通信息X Y,我们用一个数组将y的父节点设为x就可以了,读入询问之后,先对其中一个进行一次遍历,其中用一个布尔数组进行标记,直到父节点为空为止,再把剩下的扫一次,如果碰到一个点为true就输出那个点。这种方法只适合用于数据比较小和询问不多的题,其他还是老老实实的用lca吧。

代码:

var
a:array[1..10000] of integer;
i,j,n,t,x,y,k:integer;
b:array[1..10000] of boolean;
begin
readln(t);
for i:=1 to t do
begin
fillchar(a,sizeof(a),0);
readln(n);
for j:=1 to n-1 do
begin
readln(x,y);
a[y]:=x; //存储父节点
end;
readln(x,y);
fillchar(b,sizeof(b),false);
b[x]:=true;
repeat
k:=x;
b[k]:=true;
x:=a[k];
until x=0; //遍历
repeat
k:=y;
if b[k] then begin writeln(k); break; end else b[k]:=true; //查找
y:=a[k];
until y=0;
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pascal poj lca