php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 377|回复: 0

C++ 实现最近公共祖先

[复制链接]

3138

主题

3148

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7946
贡献
0
注册时间
2021-4-14
最后登录
2024-11-21
在线时间
763 小时
QQ
发表于 2022-10-2 20:33:07 | 显示全部楼层 |阅读模式
[mw_shl_code=cpp,true]#include<bits/stdc++.h>
using namespace std;
const int mxN(5e5),mxLg(19);
int n,q,rt,fa[mxLg+1][mxN+5],dep[mxN+5];
vector<int>nd[mxN+5];
void add(int u,int v){nd.push_back(v);}
void dfs(int u,int pr){
        fa[0]=pr,dep=dep[pr]+1;
        for(int i(1);i<=mxLg;++i)fa=fa[i-1][fa[i-1]];
        for(int i(0);i<nd.size();++i)if(nd!=pr)dfs(nd,u);
}
int LCA(int u,int v){
        if(dep<dep[v])swap(u,v);
        for(int i(mxLg);i>=0;--i){
                if(dep[fa]>=dep[v])u=fa;//如果要更新答案,要先更新再跳.
                if(u==v)return u;
        }
        for(int i(mxLg);i>=0;--i)if(fa!=fa[v])u=fa,v=fa[v];//等于0也是相同的.
        return fa[0];//不是u.
}
int main(){
        scanf("%d%d%d",&n,&q,&rt);
        for(int i(1),u,v;i<n;++i)scanf("%d%d",&u,&v),add(u,v),add(v,u);
        dfs(rt,0);int u,v;
        while(q--)scanf("%d%d",&u,&v),printf("%d\n",LCA(u,v));
        return 0;
}[/mw_shl_code]

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-22 03:18 , Processed in 0.336474 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表