zoukankan      html  css  js  c++  java
  • 【LOJ#10134】dis

    LCA的模板题,以代码为主

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 typedef long long ll;
     5 inline int read() {
     6     int ret=0,f=1;
     7     char c=getchar();
     8     while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
     9     while(c<='9'&&c>='0') ret=ret*10+c-'0',c=getchar();
    10     return ret*f;
    11 }
    12 using namespace std;
    13 int n,m;
    14 struct edge {
    15     int next,to;
    16 }a[100010<<1];
    17 int head[100010<<1],num,dis[100010],fa[100010][25],log[100010];
    18 inline void add(int from,int to) {
    19     a[++num].next=head[from];
    20     a[num].to=to;
    21     head[from]=num;
    22     swap(from,to);
    23     a[++num].next=head[from];
    24     a[num].to=to;
    25     head[from]=num;
    26 }
    27 void dfs(int now,int f) {
    28     dis[now]=dis[f]+1;
    29     for(int i=0;i<=20;i++) fa[now][i+1]=fa[fa[now][i]][i];
    30     for(int i=head[now];i;i=a[i].next) {
    31         int v=a[i].to;
    32         if(v==f) continue ;
    33         fa[v][0]=now;
    34         dfs(v,now);
    35     }
    36 }
    37 int lca(int x,int y) {
    38     if(dis[x]<dis[y]) swap(x,y);
    39     for(int i=20;i>=0;i--) {
    40         if(dis[fa[x][i]]>=dis[y]) x=fa[x][i];
    41         if(x==y) return x;
    42     }
    43     for(int i=20;i>=0;i--)
    44         if(fa[x][i]!=fa[y][i]) {
    45             x=fa[x][i];
    46             y=fa[y][i];
    47         }
    48     return fa[x][0];
    49 }
    50 int main() {
    51     n=read();
    52     for(int i=1,x,y;i<n;i++) {
    53         x=read(); y=read();
    54         add(x,y);
    55     }
    56     log[0]=-1;
    57     for(int i=1;i<=20;i++) log[i]=log[i<<1]+1;
    58     dfs(1,0);
    59     m=read();
    60     while(m--) {
    61         int x=read(),y=read();
    62         printf("%d
    ",dis[x]+dis[y]-dis[lca(x,y)]*2);
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    什么是css权重
    html5 canvas画五角星(美国队长)
    从输入URL到页面加载发生了什么
    javascript之事件委托(转)
    javascript之常用排序算法
    javascript之闭包
    javascript二维数组的删除
    javascript之apply()、call()
    div+css两列布局与三列布局
    css处理水平居中问题(淘宝双飞翼布局)
  • 原文地址:https://www.cnblogs.com/shl-blog/p/10500485.html
Copyright © 2011-2022 走看看