LCA RMQ ST表优化 模板

本文深入解析了LCA算法,一种用于解决求解树上两点最近公共祖先问题的有效方法。通过详细展示LCA算法的实现代码,包括边的定义、DFS遍历、RMQ预处理以及LCA和距离查询功能,帮助读者理解算法原理及应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct LCA {
	struct edge {
		int from, to, w, nxt;
	} edges[maxn << 3];
	int head[maxn << 1], cnt1;
	int id[maxn << 1], in[maxn << 1], Dep[maxn << 1], Dist[maxn << 1], cnt2;
	int RMQ[maxn << 1][25];
	int vis[maxn];
	void addedge(int u, int v, int w) {
		edges[cnt1] = { u,v,w,head[u] };
		head[u] = cnt1++;
	}

	void init() {
		mem(head, -1);
		cnt1 = cnt2 = 0;
	}

	void DFS(int u, int f, int d, int dis) {
		vis[u] = 1;
		in[++cnt2] = u;
		Dep[cnt2] = d;
		id[u] = cnt2;
		Dist[u] = dis;
		for (int i = head[u]; i != -1; i = edges[i].nxt) {
			int v = edges[i].to;
			if (vis[v]) continue;
			DFS(v, u, d + 1, dis + 1);
			in[++cnt2] = u;
			Dep[cnt2] = d;
		}
	}

	void initRMQ() {
		for (int i = 1; i <= cnt2; i++)
			RMQ[i][0] = i;
		for (int j = 1; (1 << j) <= cnt2; j++) {
			for (int i = 1; i + (1 << j) - 1 <= cnt2; i++) {
				int x = RMQ[i][j - 1];
				int y = RMQ[i + (1 << (j - 1))][j - 1];
				RMQ[i][j] = Dep[x] < Dep[y] ? x : y;
			}
		}
	}

	int getLCA(int a, int b) {
		int k, x, y;
		a = id[a]; b = id[b];
		if (a > b)swap(a, b);
		k = log(1.0 + b - a) / log(2.0);
		x = RMQ[a][k];
		y = RMQ[b - (1 << k) + 1][k];
		return Dep[x] < Dep[y] ? in[x] : in[y];
	}

	int getdist(int x, int y) {
		return Dist[x] + Dist[y] - 2 * Dist[getLCA(x, y)];
	}

}L;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值