码迷,mamicode.com
首页 > 其他好文 > 详细

lca模板

时间:2017-08-14 23:42:47      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:return   style   char   else   bit   define   utc   i++   log   

#include<bits/stdc++.h>
#define M 500010
using namespace std;

int n,m,s,f[M][21],deep[M];

void in(int &x)
{
    char c=getchar();x=0;
    while(c<0||c>9)c=getchar();
    while(c<=9&&c>=0) x=x*10+c-0,c=getchar();
}

struct node
{
    int n;
    node *next;
}*e[M];

void push(int x,int y)
{
    node *p;
    p=new node();
    p->n=y;
    if(e[x]==NULL)
    e[x]=p;
    else
    {
        p->next=e[x]->next;
        e[x]->next=p;
    }
}

void build(int now)
{
    deep[now]=deep[f[now][0]]+1;
    for(int i=1;(1<<i)<=deep[now];i++)
    f[now][i]=f[f[now][i-1]][i-1];
    for(node *i=e[now];i!=NULL;i=i->next)
    {
        if(i->n!=f[now][0])
        {
            f[i->n][0]=now;
            build(i->n);
        }
    }
} 

void out(int x)
{
    if(x>9)out(x/10);
    putchar(x%10+0);
}

int query(int x,int y)
{
    if(deep[x]<deep[y])
     swap(x,y);
     int c=deep[x]-deep[y];
    for(int i=0;i<=log2(c);i++)
      if((1<<i)&c)
      x=f[x][i];
    if(x==y)
    return x;
    for(int i=log2(deep[x]);i>=0;i--)
    {
        if(f[x][i]!=f[y][i])
        {
            x=f[x][i];
            y=f[y][i];
        }
    }
    return f[x][0];
}

int main()
{ 

  in(n),in(m),in(s);
   int x,y;
  for(int i=1;i<n;i++)
    {
        in(x),in(y);
        push(x,y);
        push(y,x);
    }
    f[s][0]=s;
    build(s);
    for(int i=1;i<=m;i++)
    {
        in(x),in(y);
        out(query(x,y));
        putchar(\n);
    }
  return 0;
}

 

lca模板

标签:return   style   char   else   bit   define   utc   i++   log   

原文地址:http://www.cnblogs.com/war1111/p/7360591.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!