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

倍增-LCA

时间:2017-09-14 20:18:47      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:--   out   wap   while   putchar   pre   put   back   logs   

#include <bits/stdc++.h>
using namespace std;
int n,tree[500005][21],deep[500005];
vector<int> v[500005];
void qin(int &aaa){
char c=getchar();
int ans=0;
    while(c<‘0‘||c>‘9‘)c=getchar();
    while(c>=‘0‘&&c<=‘9‘)ans=ans*10+c-‘0‘,c=getchar();
    aaa=ans;
}
void qout(int aaa){
char s[11];
int n=0;
    while(aaa>0){
        s[++n]=aaa%10+‘0‘;
        aaa/=10;
    }
    for(int i=n;i>=1;i--)putchar(s[i]);
    putchar(‘\n‘);
}
void dfs(int now,int l){
    for(int i=0;i<v[now].size();i++)
        if(v[now][i]!=l){
            tree[v[now][i]][0]=now;
            deep[v[now][i]]=deep[now]+1;
            dfs(v[now][i],now);
        }
}
void inti(){
    for(int i=1;i<=19;i++)
        for(int j=1;j<=n;j++)
            tree[j][i]=tree[tree[j][i-1]][i-1];
}
int LCA(int a,int b){
    if(deep[a]<deep[b])swap(a,b);
    int c=deep[a]-deep[b],ii=0;;
    while(c>0){
        if(c&1)a=tree[a][ii];
        c>>=1;
        ii++;
    }
    if(a==b)return a;
    for(int i=19;~i;i--)
        if(tree[a][i]!=tree[b][i])a=tree[a][i],b=tree[b][i];
    return tree[a][0];
}
int main(){
int m,s;
    qin(n);qin(m);qin(s);
    for(int i=1;i<n;i++){
        int a,b;
        qin(a);qin(b);
        v[a].push_back(b);
        v[b].push_back(a);
    }
    dfs(s,0);
    inti();
    for(int i=1;i<=m;i++){
        int aa,ab;
        qin(aa);
        qin(ab);
        qout(LCA(aa,ab));
    }
    return 0;
}

  

倍增-LCA

标签:--   out   wap   while   putchar   pre   put   back   logs   

原文地址:http://www.cnblogs.com/HC-LittleJian/p/7522306.html

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