专栏文章

【模板】最近公共祖先

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mimzwpd5
此快照首次捕获于
2025/12/01 18:17
3 个月前
此快照最后确认于
2025/12/01 18:17
3 个月前
查看原文

倍增

CPP
struct 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 条评论,欢迎与作者交流。

正在加载评论...