zoukankan      html  css  js  c++  java
  • 1787: [Ahoi2008]Meet 紧急集合

    Time Limit: 20 Sec  Memory Limit: 162 MB
    Submit: 4669  Solved: 2246
    [Submit][Status][Discuss]

    Description

    Input

    Output

    Sample Input

    6 4
    1 2
    2 3
    2 4
    4 5
    5 6
    4 5 6
    6 3 1
    2 4 4
    6 6 6

    Sample Output


    5 2
    2 5
    4 1
    6 0

    HINT

    LCA果然还是玄学,倍增父节点这点理解好久

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 
     5 const int MAXN=1000005;
     6 struct Edge
     7 {
     8     int to,next;
     9 }E[MAXN];
    10 int node,head[MAXN];
    11 int deep[MAXN],fa[MAXN][20];
    12 bool vis[MAXN];
    13 int n,m;
    14 
    15 void insert(int u,int v)
    16 {
    17     E[++node]=(Edge){v,head[u]};head[u]=node;
    18     E[++node]=(Edge){u,head[v]};head[v]=node;
    19 }
    20 
    21 void dfs(int x)
    22 {
    23     vis[x]=1;
    24     for(int i=1;i<=18;i++)
    25     {
    26         if(deep[x]<(1<<i)) break;
    27         fa[x][i]=fa[fa[x][i-1]][i-1];
    28     }
    29     for(int i=head[x];i;i=E[i].next)
    30     {
    31         if(vis[E[i].to]) continue;
    32         deep[E[i].to]=deep[x]+1;
    33         fa[E[i].to][0]=x;
    34         dfs(E[i].to);
    35     }
    36 }
    37 
    38 int lca(int x,int y)
    39 {
    40     if(deep[x]<deep[y]) swap(x,y);
    41     int d=deep[x]-deep[y];
    42     for(int i=0;i<=18;i++)
    43         if((1<<i)&d) x=fa[x][i];
    44     for(int i=18;i>=0;i--)
    45         if(fa[x][i]!=fa[y][i])
    46         {
    47             x=fa[x][i];
    48             y=fa[y][i];
    49         }
    50     if(x==y) return x;
    51     else return fa[x][0];
    52 }
    53 
    54 int dis(int x,int y)
    55 {
    56     int t=lca(x,y);
    57     return deep[x]+deep[y]-2*deep[t];
    58 }
    59 
    60 int main()
    61 {
    62     scanf("%d%d",&n,&m);
    63     for(int i=1;i<n;i++)
    64     {
    65         int u,v;
    66         scanf("%d%d",&u,&v);
    67         insert(u,v);
    68     }
    69     dfs(1);
    70     for(int i=1;i<=m;i++)
    71     {
    72         int x,y,z;
    73         scanf("%d%d%d",&x,&y,&z);
    74         int a=lca(x,y),b=lca(x,z),c=lca(y,z),t;
    75         if(a==b) t=c;
    76         else if(b==c) t=a;
    77         else if(a==c) t=b;
    78         int ans=dis(x,t)+dis(y,t)+dis(z,t);
    79         printf("%d %d
    ",t,ans);
    80     }
    81     return 0;
    82 }
  • 相关阅读:
    ASP.NET中在一般处理程序中使用session的简单介绍
    oracle 11gR2安装图文教程
    ORACEL 创建表空间
    Echarts使用心得总结(二)
    SqlServer 2008无法远程连接到服务器
    浅谈HTTP中Get与Post的区别
    java设计模式-观察者模式学习
    读牛人博客有感
    mysql的with rollup
    java中的枚举enum
  • 原文地址:https://www.cnblogs.com/InWILL/p/10643139.html
Copyright © 2011-2022 走看看