1171. 距离(离线求LCA:tarjan算法)

1171. 距离 - AcWing题库

给出 n 个点的一棵树,多次询问两点之间的最短距离。

注意:

  • 边是无向的。
  • 所有节点的编号是 1,2,…,n1。
输入格式

第一行为两个整数 n 和 m。n 表示点数,m 表示询问次数;

下来 n−1 行,每行三个整数 x,y,k,表示点 x 和点 y 之间存在一条边长度为 k;

再接下来 m 行,每行两个整数 x,y,表示询问点 x 到点 y 的最短距离。

树中结点编号从 1 到 n。

输出格式

共 m 行,对于每次询问,输出一行询问结果。

数据范围

2≤n≤104
1≤m≤2×104
0<k≤100
1≤x,y≤n

输入样例1:
2 2 
1 2 100 
1 2 
2 1
输出样例1:
100
100
输入样例2:
3 2
1 2 10
3 1 15
1 2
3 2
输出样例2:
10
25

 解析:

tarjan————离线求LCA,O(n+m)

在深度优先遍历时,将所有点分成三大类:

[1]已经遍历过,且回溯过的点

[2]正在搜索的分支

[3]还未搜索到的点

本题思路:

d(x)+d(y)-2*d(p),其中p=LCA(x,y)。

本题使用离线的tarjan算法求LCA。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 1e4 + 5, M = 2e4 + 5;
int n, m;
int h[N], e[M], w[M], ne[M], idx;
int dist[N], p[N], ret[M], vis[N];
vector<PII>query[N];void add(int a, int b, int c) {e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}void dfs(int u, int fa) {for (int i = h[u]; i != -1; i = ne[i]) {int j = e[i];if (j == fa)continue;dist[j] = dist[u] + w[i];dfs(j, u);}
}int find(int a) {if (p[a] == a)return a;return p[a] = find(p[a]);
}void tarjan(int u) {vis[u] = 1;for (int i = h[u]; i != -1; i = ne[i]) {int j = e[i];if (!vis[j]) {tarjan(j);p[j] = u;}}for (auto i : query[u]) {int y = i.first, id = i.second;if (vis[y] == 2) {int ans = find(y);ret[id]= dist[u] + dist[y] - dist[ans] * 2;}}vis[u] = 2;
}int main() {cin >> n >> m;memset(h, -1, sizeof h);for (int i = 1,a,b,c; i <= n-1; i++) {scanf("%d%d%d", &a, &b, &c);add(a, b, c), add(b, a, c);}for (int i = 1,a,b; i <= m; i++) {scanf("%d%d", &a, &b);if (a != b) {query[a].push_back({ b,i });query[b].push_back({ a,i });}}for (int i = 1; i <= n; i++)p[i] = i;dfs(1, -1);tarjan(1);for (int i = 1; i <= m; i++) {printf("%d\n", ret[i]);}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT-Thread: STM32 SPI使用流程

1.添加驱动 ①点开设置界面 ②勾选看门 SPI 驱动 ③点击保存 ④查看添加的驱动文件 drv_spi.c 2.打开驱动头文件定义 ①打开配置文件 ②打开定义 3.打开需要开启的SPI总线 打开 drivers 目录下的 board.h 用SPI搜索&#xff0c;找到如下文字&#xff0c;打开对应的宏。 /*-…

程序运行只会占用到服务器里面一个核心使用,其他核心不工作,是什么问题

随着网络发展&#xff0c;在网络方面开展工作离不开服务器的使用&#xff0c;而在我们日常服务器运行使用过程中&#xff0c;可能会遇到各种问题&#xff0c;这些问题可能会影响服务器的性能和稳定性。最近德迅云安全就有遇到有用户来询问&#xff0c;自己服务器使用上很卡&…

巴厘行记(四)——乌布漫游

欢迎览阅《巴厘行记》系列文章 巴厘行记巴厘行记&#xff08;一&#xff09;——海神庙 巴厘行记&#xff08;二&#xff09;——乌布之夜 巴厘行记&#xff08;三&#xff09;——Auntie和Mudi 巴厘行记&#xff08;四&#xff09;——乌布漫游 巴厘行记&#xff08;五&a…

Pytest单元测试框架

第一章、pytest概述 Pytest is a framework that makes building simple and scalable tests easy. Tests are expressive and readable—no boilerplate code required. Get started in minutes with a small unit test or complex functional test for your application or l…

深入理解与防范C语言中的栈溢出问题

一、引言 栈溢出是计算机安全领域中一个常见的漏洞&#xff0c;特别是在C语言编程中。由于C语言的灵活性和对内存管理的直接操作性&#xff0c;如果程序员在编写代码时不注意&#xff0c;就可能导致栈溢出的发生。本文将全面解析栈溢出的概念、原因、影响以及防范措施。 二、…

springboot+vue3支付宝接口案例-第二节-准备后端数据接口

springbootvue3支付宝接口案例-第二节-准备后端数据接口&#xff01;今天经过2个小时的折腾。准备好了我们这次测试支付宝线上支付接口的后端业务数据接口。下面为大家分享一下&#xff0c;期间发生遇到了一些弯路。 首先&#xff0c;我们本次后端接口使用的持久层框架是JPA。这…

3d合并模型是重名材质---模大狮模型网

当合并3d模型时&#xff0c;如果存在重名的材质&#xff0c;可能会导致加载问题。这是因为3D软件在处理重名材质时可能会出现冲突。你可以尝试以下方法解决这个问题&#xff1a; 重命名材质&#xff1a;检查合并的模型中的材质&#xff0c;确保它们具有唯一的命名。修改重名的材…

Pyroch中transforms 图像增强发方法的应用

1 应用场景 在我们训练模型的时候&#xff0c;有的时候数据不够&#xff0c;就需要通过水平翻转、垂直翻转、镜像、旋转、改变亮度、标准化等方式增加图像的多样性&#xff0c;此时可以调用Pytorch 中的Transforms完成这些操作 2 导入相应的库 from torchvision import tran…

多场景建模:美团HiNet

HiNet: Novel Multi-Scenario & Multi-Task Learning with Hierarchical Information Extraction 背景&#xff1a; 美团的多场景多任务&#xff08;ctr、ctcvr&#xff09; 解决方案 通过分层来分别学习多场景多任务 方案详情 点评&#xff1a;在底层Embedding时用…

如何实现Win系统ssh连接Ubuntu使用vscode远程敲代码

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接…

opencv#35 连通域分析

连通域分割原理 像素领域介绍: 4邻域是指中心的像素与它邻近的上下左右一共有4个像素&#xff0c;那么称这4个像素为中心像素的4邻域。 8邻域是以中心像素周围的8个像素分别是上下左右和对角线上的4个像素。 连通域的定义(分割)分为两种:以4邻域为相邻判定条件的连通域分割和…

让AI帮你说话--GPT-SoVITS教程

有时候我们在录制视频的时候&#xff0c;由于周边环境嘈杂或者录音设备问题需要后期配音&#xff0c;这样就比较麻烦。一个比较直观的想法就是能不能将写好的视频脚本直接转换成我们的声音&#xff0c;让AI帮我们完成配音呢&#xff1f;在语音合成领域已经有很多这类工作了&…

ChatGPT的工作原理

ChatGPT正在做什么...以及为什么它有效? GPT代表"Generative Pre-trained Transformer",是一种基于Transformer架构的生成式预训练模型。只需一次添加一个单词 当ChatGPT生成文本时,它通过不断询问“给定到目前为止的文本,下一个单词应该是什么?”来进行预测。在…

快捷键:IDEA 清理无效导入依赖

快捷键&#xff1a;IDEA 清理无效导入依赖 要批量清理无用的import语句&#xff08;类级别的依赖&#xff09;&#xff0c;可以使用快捷键&#xff1a; Windows/Linux系统&#xff1a;Ctrl Alt OmacOS系统&#xff1a;Cmd Option O 这个快捷键的作用是优化导入&#xff…

1.Mybatis入门

目录 前言 1入门 1.1 入门程序实现 1.2 数据准备 ​编辑 1.3 配置Mybatis 1.4 编写SQL语句 1.5 单元测试 1.6 解决SQL警告与提示 2. JDBC介绍(了解) 2.1 介绍 2.2 代码 2.3 问题分析 2.4 技术对比 3. 数据库连接池 3.1 介绍 3.2 产品 4. lombok 4.1 介绍 4.…

flink源码分析 - jar包中提取主类和第三方依赖

flink版本: flink-1.11.2 提取主类代码位置: org.apache.flink.client.program.PackagedProgram#getEntryPointClassNameFromJar 提取第三方依赖代码位置:org.apache.flink.client.program.PackagedProgram#getJobJarAndDependencies 代码逻辑比较简单&#xff0c;此处不再赘…

AOP+Redisson 延时队列,实现缓存延时双删策略

一、缓存延时双删 关于缓存和数据库中的数据保持一致有很多种方案&#xff0c;但不管是单独在修改数据库之前&#xff0c;还是之后去删除缓存都会有一定的风险导致数据不一致。而延迟双删是一种相对简单并且收益比较高的实现最终一致性的方式&#xff0c;即在删除缓存之后&…

哪些 3D 建模软件值得推荐?

云端地球是一款免费的在线实景三维建模软件&#xff0c;不需要复杂的技巧&#xff0c;只要需要手机&#xff0c;多拍几张照片&#xff0c;就可以得到完整的三维模型&#xff01; 无论是大场景倾斜摄影测量还是小场景、小物体建模&#xff0c;都可以通过云端地球将二维数据向三…

【JLU】校园网linux客户端运行方法

终于给这输入法整好了&#xff0c;就像上面图里那样执行命令就行 写一个开机自启的脚本会更方便&#xff0c;每次都运行也挺烦的 补充了一键运行脚本&#xff0c;文件路径需要自己修改 #!/bin/bashrun_per_prog"sudo /home/d0/ubuntu-drclient-64/DrClient/privillege.s…

为什么3d合并的模型不能移动---模大狮模型网

当你在3D软件中合并模型后&#xff0c;如果无法移动合并后的模型&#xff0c;可能有以下几个可能的原因&#xff1a; 模型被锁定或冻结&#xff1a;在3D软件中&#xff0c;你可能会将模型锁定或冻结以防止意外的移动或编辑。请确保解锁或解冻模型&#xff0c;这样你就可以自由地…