专栏文章
【模板】最近公共祖先
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mimzwpd5
- 此快照首次捕获于
- 2025/12/01 18:17 3 个月前
- 此快照最后确认于
- 2025/12/01 18:17 3 个月前
倍增
CPPstruct LCA
{
static const int N = 5e5+5,M = 1e6+5,P = 20;
struct node {int to,ne;} edge[M];
int head[N],len = 0,dep[N],fa[N][P];
struct iterator
{
int indx;LCA *g;
iterator (int _i,LCA *_g) : indx(_i) , g(_g) {}
iterator operator++(int) {iterator t = *this;return indx = g->edge[indx].ne,t;}
int operator*() {return g->edge[indx].to;}
operator bool () {return (bool)indx;}
};
void insert(int u,int v) {edge[++len] = {v,head[u]},head[u] = len;}
void add(int u,int v) {insert(u,v),insert(v,u);}
iterator begin(int x) {return iterator(head[x],this);}
void dfs(int x = 1,int f = 0)
{
dep[x] = dep[f]+1,fa[x][0] = f;
for (int i = 1;i < P;i ++) fa[x][i] = fa[fa[x][i-1]][i-1];
for (auto i = begin(x);i;i ++) if (*i != f) dfs(*i,x);
}
int lca(int x,int y)
{
if (dep[x] < dep[y]) swap(x,y);
for (int i = P-1;i >= 0;i --) if (dep[fa[x][i]] >= dep[y]) x = fa[x][i];
if (x == y) return x;
for (int i = P-1;i >= 0;i --) if (fa[x][i] != fa[y][i]) x = fa[x][i],y = fa[y][i];
return fa[x][0];
}
};
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...