数据结构与算法--LCA/最近公共祖先

#include
#include
#include
using namespace std;

int n,m,s;
vector edge[500005];
int depth[500005];
int anc[500005][20];

void dfs(int now, int fa){
    depth[now]=depth[fa]+1;
    anc[now][0] = fa;
    for(int i=1;(1<=0;i--){
            if((1<=0;i--){
        if((1<depth[x]-1) continue;
        if(anc[x][i]==anc[y][i]) continue;
        x = anc[x][i];
        y = anc[y][i];
    }
    return anc[x][0];
}

int main()
{
    scanf("%d%d%d",&n,&m,&s); //n个点,m条边,s是根节点
    for(int i=1;i<=n-1;i++){
        int x,y;scanf("%d%d",&x,&y);
        edge[x].push_back(y);
        edge[y].push_back(x);
    }
    dfs(s,0);  // 预处理每个节点的深度和第2^i级祖先
    for(int i=1;i<=m;i++){
        int x,y;scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y)); // 倍增法计算两个节点的最近公共祖先
    }
    return 0;
}

参考:

C++ P3379 【模板】最近公共祖先(LCA)_最近公共祖先c++代码_Object_S的博客-CSDN博客

关于LCA算法(倍增法)的几点总结_Object_S的博客-CSDN博客

你可能感兴趣的:(数据结构与算法,算法,数据结构)