您好,欢迎来到要发发知识网。
搜索
您的当前位置:首页LCA 【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego

LCA 【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego

来源:要发发知识网

【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego

LCA简单题,写个函数模拟往上跳的过程就行。还要分情况讨论。

code:

#include<iostream>
#include<cstdio>
using namespace std;
const int wx=1000017;
inline int read(){
    int sum=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
    return sum*f;
}
struct e{
    int nxt,to;
}edge[wx*2];
int n,m,k,ans,x,y,z,now,num;
int head[wx],f[wx][23],dep[wx];
void add(int from,int to){
    edge[++num].nxt=head[from];
    edge[num].to=to;
    head[from]=num;
}
void dfs(int u,int fa){
    dep[u]=dep[fa]+1;
    for(int i=head[u];i;i=edge[i].nxt){
        int v=edge[i].to;
        if(v==fa)continue;
        f[v][0]=u;
        dfs(v,u);
    }
}
void pre(){
    for(int j=1;j<=21;j++){
        for(int i=1;i<=n;i++){
            f[i][j]=f[f[i][j-1]][j-1];
        }
    }
}
int LCA(int x,int y){
    if(dep[x]<dep[y])swap(x,y);
    for(int i=21;i>=0;i--){
        if(dep[f[x][i]]>=dep[y])x=f[x][i];
    }
    if(x==y)return x;
    for(int i=21;i>=0;i--){
        if(f[x][i]!=f[y][i]){
            x=f[x][i];y=f[y][i];
        }
    }
    return f[x][0];
}
int work(int now,int x){
    for(int i=21;i>=0;i--){
        if(dep[now]-dep[f[now][i]]<=x){
            x-=(dep[now]-dep[f[now][i]]);now=f[now][i];
        }
    }
    return now;
}
int main(){
    n=read();now=read();k=read();
    for(int i=1;i<n;i++){
        int x,y;
        x=read();y=read();
        add(x,y);add(y,x);
    }
    dfs(1,0);pre();
    for(int i=1;i<=k;i++){
        int dis,to;
        to=read();dis=read();
        int lca=LCA(now,to);
        if(dep[now]+dep[to]-2*dep[lca]<=dis){
            now=to;
            printf("%d\n",now);
        }
        else if(dep[now]-dep[lca]>=dis){
            now=work(now,dis);
            printf("%d\n",now);
        }
        else{
            now=work(to,dep[now]+dep[to]-2*dep[lca]-dis);
            printf("%d\n",now);
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/wangxiaodai/p/9775127.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- net188.cn 版权所有 湘ICP备2022005869号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务