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

news/2024/12/22 2:38:39/

前言:一开始看到这个题目的时候,感觉就和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]2dep[lca(x,y)]

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


题目地址

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
#define ll long longconst 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;
}

http://www.ppmy.cn/news/1527436.html

相关文章

Android AlertDialog圆角背景不生效的问题

一行解决: window?.setBackgroundDrawableResource(android.R.color.transparent) 原文件: /*** Created by Xinghai.Zhao* 自定义选择弹框*/ SuppressLint("InflateParams", "MissingInflatedId") class CustomDialog(context: Context?) : AlertDia…

【MQTT协议使用总结】基于-FreeRTOS平台-移植MQTT协议栈

文章目录 仓库地址关键接口适配FreeRTOS_readFreeRTOS_writeNetworkInit && NetworkConnect && NetworkDisconnect 总结 仓库地址 https://github.com/eclipse/paho.mqtt.embedded-c 这里官方给了一些平台适配案例&#xff0c;这里参考FreeRTOS的 关键接口适配…

C++学习笔记----7、使用类与对象获得高性能(二)---- 理解对象生命周期(1)

对象的生命周期包含三个活动&#xff1a;生成&#xff0c;解体&#xff0c;与赋值。理解如何以及什么时候生成、解体以及赋值对象&#xff0c;以及如何客户化其行为非常重要。 1、对象生成 对象在声明的时候生成&#xff08;如果是在栈上的话&#xff09;&#xff0c;或者显式…

打造民国风格炫酷个人网页:用HTML和CSS3传递民国风韵

附源码&#xff01;&#xff01;&#xff01; 感谢支持 小弟不断创作网站demo感兴趣的可以关注支持一下 对了 俺在结尾带上了自己用的 背景 大家可以尝试换一下效果更好哦~~~ 如何创建一个民国风格的炫酷网页 在这篇博客中&#xff0c;我们将展示如何制作一个结合民国风格和…

python植物大战僵尸项目源码【免费】

植物大战僵尸是一款经典的塔防游戏&#xff0c;玩家通过种植各种植物来抵御僵尸的进攻。 源码下载地址&#xff1a; 植物大战僵尸项目源码 提取码: 8muq

避免 PyCharm 将该 Python 脚本作为测试运行

为了避免 PyCharm 将该 Python 脚本作为测试运行&#xff08;即 pytest 自动捕获&#xff09;&#xff0c;你可以做以下几步来确保该脚本作为普通的 Python 程序执行&#xff0c;而不是作为 pytest 运行。 解决方案&#xff1a; 1. 确保文件名不以 test_ 开头&#xff1a; P…

electron有关mac构建

针对 Mac M1/2/3 芯片的设备&#xff0c;proces.archarm64. 执行下面命令&#xff0c;检查下按照的 node.js 版本是不是 intel x64 指令集&#xff0c;如果是的话安装下 arm64 指令集的 node.js终端中执行以下命令&#xff1a;node -p process.arch 对应的node版本也是arm版 …

区块链领航者孙宇晨:驾驭潮流,共绘未来新篇章

​区块链技术的迅速发展正在重塑全球经济格局&#xff0c;而孙宇晨&#xff0c;作为这一变革的先锋人物之一&#xff0c;以其卓越的远见和创新能力在行业内引领潮流&#xff0c;开创了区块链未来的新局面。 孙宇晨的名字与区块链技术密不可分。作为波场TRON的创始人&#xff0c…