80分倍增求调悬关
查看原帖
80分倍增求调悬关
545873
starlife楼主2023/7/16 21:57
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=500005;
struct Edge{
    int to, next;
}edge[2*N];
int head[2*N], cnt;
void addedge(int u,int v){
	edge[cnt].to = v;
	edge[cnt].next = head[u];
	head[u] = cnt++;
}
int fa[N][20], deep[N];
void dfs(int x,int father){
    deep[x] = deep[father]+1;
    fa[x][0] = father;
    for(int i=1;(1<<i)<=deep[x];i++)
    	    fa[x][i] = fa[fa[x][i-1]][i-1];
    for(int i=head[x];i;i=edge[i].next)
        if(edge[i].to != father)
           dfs(edge[i].to, x);
}
int LCA(int x,int y){
    if(deep[x]<deep[y])  swap(x,y);
    for(int i=19;i>=0;i--)
        if(deep[x]-(1<<i)>=deep[y])
            x = fa[x][i];
    if(x==y)  return x;
    for(int i=19;i>=0;i--)
        if(fa[x][i]!=fa[y][i]){
            x = fa[x][i];
            y = fa[y][i];
        }
    return fa[x][0];
}
signed main(){
    int n,m,root;
    scanf("%lld%lld%lld",&n,&m,&root); 
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%lld%lld",&u,&v); 
        addedge(u,v);
        addedge(v,u);
    }
    dfs(root,0);
    while(m--){
        int a,b;
        scanf("%lld%lld",&a,&b); 
        if(LCA(a,b)==0)printf("1\n");
        else printf("%lld\n",LCA(a,b));
    }
    return 0;
}
2023/7/16 21:57
加载中...