zoukankan      html  css  js  c++  java
  • LCA模板

          LCA就是求解一棵树上两个节点的最近的共同祖先,主要运用倍增思想来解决问题。

    pascal模板

    倍增算法 

    for j:=1 to k do
    for i:=1 to n do
         f[i,j]:=f[f[i,j-1],j-1];
    (注:k:=ln(n)/ln(2),循环顺序一定不可以错)

    节点深度

    (计算节点深度同时计算出从根到节点路径上数字的和)

    procedure dfs(x:longint);
    begin
      if d[x]>0 then exit;
      if f[x,0]>0 then
      begin
        dfs(f[x,0]);
        d[x]:=d[f[x,0]]+1;
        sum[x]:=sum[f[x,0]]+a[x];
      end
      else begin
        d[x]:=1;
        sum[x]:=0;
      end;
    end;

     LCA 

    function lca(x,y:longint):longint;
    var
      z,i:longint;
    begin
      if x=y then exit(x);
      if d[x]<d[y] then begin
        x:=x xor y;
        y:=x xor y;
        x:=x xor y;
      end;
      if f[y,0]=0 then exit(y);
      if d[x]<>d[y] then
      begin
        i:=k;
        repeat
          while d[f[x,i]]>=d[y] do
          x:=f[x,i];
          dec(i);
        until i<0;
      end;
      if x=y then exit(x);
      i:=k;
      repeat
        while f[x,i]<>f[y,i] do
        begin
          x:=f[x,i];
          y:=f[y,i];
        end;
        dec(i);
      until i<0;
      exit(f[x,0]);
    end;

           代码一定要理解并记住,明白工作原理。题目就不复习了,LCA之类的题很多,但是对数据进行巧妙的转化,就可以用LCA来解决了。所以建模能力比算法更重要。

    愿你出走半生,归来仍是少年

  • 相关阅读:
    297. Serialize and Deserialize Binary Tree
    331. Verify Preorder Serialization of a Binary Tree
    332. Reconstruct Itinerary
    329. Longest Increasing Path in a Matrix
    319. Bulb Switcher
    292. Nim Game
    299. Bulls and Cows
    Ice Cream Tower Gym
    B
    C
  • 原文地址:https://www.cnblogs.com/forever97/p/3427658.html
Copyright © 2011-2022 走看看