zoukankan      html  css  js  c++  java
  • 树链剖分求LCA

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<algorithm>
     6 using namespace std;
     7 #define maxn 1000010
     8 #define IL inline
     9 IL void read(int &x)
    10 {
    11     x=0;int f=1;char ch=getchar();
    12     while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
    13     while(ch>='0'&&ch<='9'){x=x*10+ch-'0',ch=getchar();}x*=f;
    14 }
    15 
    16 int n,m,s,tot;
    17 int first[maxn],deep[maxn],fa[maxn],son[maxn],size[maxn],top[maxn];
    18 struct edge{
    19     int nextx,to;
    20 }e[maxn];
    21 
    22 void add(int u,int v)
    23 {
    24     tot++;
    25     e[tot].nextx=first[u];
    26     first[u]=tot;
    27     e[tot].to=v;
    28 }
    29 
    30 void dfs1(int x,int f,int depth)
    31 {
    32     fa[x]=f;
    33     deep[x]=depth;
    34     size[x]=1;
    35     int mson=-1;
    36     for(int i=first[x];i;i=e[i].nextx)
    37     {
    38         int u=e[i].to;
    39         if(u==f)continue;
    40         dfs1(u,x,depth+1);
    41         size[x]+=size[u];
    42         if(size[u]>mson)
    43             mson=size[u],son[x]=u;
    44     }
    45 }
    46 
    47 void dfs2(int x,int topf)
    48 {
    49     top[x]=topf;
    50     if(!son[x])return;
    51     dfs2(son[x],topf);
    52     for(int i=first[x];i;i=e[i].nextx)
    53     {
    54         int u=e[i].to;
    55         if(u==fa[x]||u==son[x])continue;
    56         dfs2(u,u);
    57     }
    58 }
    59 
    60 int main()
    61 {
    62     read(n),read(m),read(s);
    63     for(int i=1;i<=n-1;i++)
    64     {
    65         int a,b;
    66         read(a),read(b);
    67         add(a,b),add(b,a);
    68     }
    69     dfs1(s,s,1);
    70     dfs2(s,s);
    71     for(int i=1;i<=m;i++)
    72     {
    73         int x,y;
    74         read(x),read(y);
    75         while(top[x]!=top[y])
    76         {
    77             if(deep[top[x]]>=deep[top[y]])x=fa[top[x]];
    78             else y=fa[top[y]];
    79         }
    80         if(deep[x]<=deep[y])cout<<x<<"
    ";
    81         else cout<<y<<"
    ";
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    开启ecstore隐藏的功能
    对接ECOS框架(含ecstore、ocs、erp等产品)的方法【其他系统请求ecos的api接口】
    shopex 网店系统基于云登录系统的信任登录设置
    怎样获取机器码
    windows 无法连接远程桌面
    ecos框架中data/ 目录下img*文件数量过多的问题
    mac 下brew解决php安装问题
    20140708 总结
    20140705 总结
    bzoj 2751
  • 原文地址:https://www.cnblogs.com/KGW-/p/10523663.html
Copyright © 2011-2022 走看看