求树上任意两个点的距离lca

前言:一开始看到这个题目的时候,感觉就和lca有关,但是没有想到具体的公式

d = d e p [ x ] + d e p [ y ] − 2 ∗ d e p [ l c a ( x , y ) ] d = dep[x] + dep[y] - 2*dep[lca(x,y)] d=dep[x]+dep[y]−2∗dep[lca(x,y)]

并且我们这个题目还是一个进阶版本的题,我们还会存在电缆,我们还有两种选择的可能,这也是要考虑在内的


题目地址

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long

const int N = (int)5e5;
int n;
int e[N * 2], ne[N * 2], h[N], idx = 0;
int px, py;
int dep[N], fa[N][20];

inline int read()
{
	int x = 0, f = 1;
	char c = getchar();
	while (c < '0' || c>'9') { if (c == '-') f = -1; c = getchar(); }
	while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + c - '0', c = getchar();
	return f * x;
}

void add(int a, int b) {
	e[++idx] = b, ne[idx] = h[a], h[a] = idx;
}

void dfs(int u, int father) {
	dep[u] = dep[father] + 1;
	fa[u][0] = father;
	for (int i = 1; i < 20; i++) {
		fa[u][i] = fa[fa[u][i - 1]][i - 1];
	}
	for (int i = h[u]; i; i = ne[i]) {
		int to = e[i];
		if (to == father) continue;
		dfs(to, u);
	}
}

int lca(int u, int v) {
	if (dep[u] < dep[v]) swap(u, v);
	// 先跳到同一层
	for (int i = 19; i >= 0; i--) {
		if (dep[fa[u][i]] >= dep[v]) u = fa[u][i];
	}
	if (u == v) return u;
	for (int i = 19; i >= 0; i--) {
		if (fa[u][i] != fa[v][i]) {
			u = fa[u][i], v = fa[v][i];
		}
	}return fa[u][0];
}

int fun(int x, int y) {
	return dep[x] + dep[y] - 2 * dep[lca(x, y)];
}

int main() {
	cin >> n;
	for (int i = 1; i < n; i++) {
		int x, y; 
		//cin >> x >> y;
		x = read(); y = read();
		add(x, y), add(y, x);
	}
	cin >> px >> py;
	int q; cin >> q;
	dfs(1, 0);
	while (q--) {
		int x, y; 
		//cin >> x >> y;
		x = read(); y = read();
		int d = min({ fun(x,y),fun(x,px) + fun(y,py),fun(x,py) + fun(y,px) });
		//cout << d << endl;
		printf("%d\n", d);
	}return 0;
}
相关推荐
未来之窗软件服务1 小时前
自己写算法(九)网页数字动画函数——东方仙盟化神期
前端·javascript·算法·仙盟创梦ide·东方仙盟·东方仙盟算法
豐儀麟阁贵1 小时前
基本数据类型
java·算法
乐迪信息3 小时前
乐迪信息:基于AI算法的煤矿作业人员安全规范智能监测与预警系统
大数据·人工智能·算法·安全·视觉检测·推荐算法
hsjkdhs4 小时前
C++之多层继承、多源继承、菱形继承
开发语言·c++·算法
立志成为大牛的小牛4 小时前
数据结构——十七、线索二叉树找前驱与后继(王道408)
数据结构·笔记·学习·程序人生·考研·算法
星空下的曙光4 小时前
Node.js crypto模块所有 API 详解 + 常用 API + 使用场景
算法·node.js·哈希算法
StarPrayers.6 小时前
旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
前端·人工智能·python·算法·pycharm·启发式算法
爱吃橘的橘猫6 小时前
嵌入式系统与嵌入式 C 语言(2)
c语言·算法·嵌入式
235166 小时前
【LeetCode】146. LRU 缓存
java·后端·算法·leetcode·链表·缓存·职场和发展
weixin_307779137 小时前
使用Python高效读取ZIP压缩文件中的UTF-8 JSON数据到Pandas和PySpark DataFrame
开发语言·python·算法·自动化·json