• 【模板】LCA


    又写了一个板子,本来准备多种姿势求lca的,结果只调出了树上倍增求lca,时(总)运(想)不(打)济(摆)啊

    明天写好了 一言不合就立flag

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 #define maxm 500050
     6 #define maxn 500050
     7 using namespace std;
     8 struct node{int to,next;}e[maxm*2];
     9 int cnt,head[maxn],deep[maxn],p[maxn][20],n,m,s;
    10 void add(int x,int y)
    11 {
    12     e[++cnt]=(node){y,head[x]};head[x]=cnt;
    13 }
    14 inline void dfs(int u)
    15 {
    16     int i;
    17     for(i=head[u];i;i=e[i].next)
    18     {
    19         if(!deep[e[i].to])
    20         {
    21             deep[e[i].to]=deep[u]+1;
    22             p[e[i].to][0]=u;
    23             dfs(e[i].to);
    24         }
    25     }
    26  } 
    27 void pre()
    28 {
    29     for(int j=1;j<=19;j++)
    30      for(int i=1;i<=n;i++)
    31      if(p[i][j-1]) p[i][j]=p[p[i][j-1]][j-1];
    32 }
    33  int lca(int a,int b)
    34  {
    35      int j;
    36      if(deep[a]<deep[b]) swap(a,b);
    37      for(j=19;j>=0;j--) 
    38      if(deep[p[a][j]]>=deep[b])
    39      a=p[a][j];
    40      if(a==b) return a;
    41      for( j=19;j>=0;j--)
    42      {
    43          if(p[a][j]!=p[b][j])
    44          {
    45              a=p[a][j];
    46              b=p[b][j];
    47          }
    48      }
    49      return p[a][0];
    50  }
    51  void work()
    52  {
    53      int x,y;
    54      while(m--)
    55      {
    56          scanf("%d%d",&x,&y);
    57          printf("%d
    ",lca(x,y));
    58     }
    59  }
    60 int main()
    61 {
    62     int x,y; 
    63     scanf("%d%d%d",&n,&m,&s);
    64     for(int i=1;i<n;i++)
    65     {
    66         scanf("%d%d",&x,&y);
    67         add(x,y);add(y,x);
    68     }
    69     deep[s]=1; 
    70     dfs(s);
    71     pre();
    72     work();
    73     return 0;
    74  } 
    View Code

    以上 By 啦啦啦萝卜

  • 相关阅读:
    第五周
    第三章 程序的机器级表示
    第二章 信息的表示和处理
    嵌入式Linux应用开发——Linux下的C编程基础
    Linux基础入门(20135207 王国伊)
    Java实验报告(实验四)
    linux系统之pam模块
    linux 从入门到跑路-时间,日期问题
    linux 从入门到跑路-Shell和部分命令
    linux 从入门到跑路-挂载,命令的执行顺序
  • 原文地址:https://www.cnblogs.com/LQ-double/p/6075406.html
Copyright © 2020-2023  润新知