【LOJ 10130】点的距离

题解:就是lca,不过loj给我全TLE不知道怎么回事?气咕咕。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
const int N=200002;
int n,Yao_Chen,x,y;
struct node{
    int to;
    int next;
}e[N];
int cnt,d[N],f[N][21],head[N];

void add(int x,int y){
    e[++cnt].to=y;
    e[cnt].next=head[x];
    head[x]=cnt;
}
int dfs(int u,int fa){
    d[u]=d[fa]+1;
    for(int i=0;i<19;i++)
        f[u][i+1]=f[f[u][i]][i];
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(v==fa) continue;
        f[v][0]=u; dfs(v,u);
    }
}

int lca(int x,int y){
    if(d[x]<d[y]) swap(x,y);
    for(int i=20;i>=0;i--){
        if(d[f[x][i]]>=d[y]) x=f[x][i];
        if(x==y) return x;  
    }
    for(int i=20;i>=0;i--){
        if(f[x][i]!=f[y][i])
           { x=f[x][i]; y=f[y][i]; }
    }
    return f[x][0];
}

int Yao_Chen_Lai_Le(int x,int y){
    int z=lca(x,y);
    return d[x]+d[y]-2*d[z];
}

int main(){
    freopen("10130.in","r",stdin);
    freopen("10130.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        scanf("%d %d",&x,&y);
        add(x,y); add(y,x);
    }    
    dfs(1,0);
    scanf("%d",&Yao_Chen);
    while(Yao_Chen--){
        scanf("%d %d",&x,&y);
        printf("%d
",Yao_Chen_Lai_Le(x,y));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11839981.html