POJ1330 Nearest Common Ancestors 非lca pascal 解题报告

题目大意:在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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值