【算法】距离(最近公共祖先节点)

news2024/12/22 22:50:05

题目

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

注意:

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

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

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

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

树中结点编号从 1 到 n。

输出格式

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

数据范围

2 ≤ n ≤ 10^4
1 ≤ m ≤ 2 × 10^4
0 < k ≤ 100
1 ≤ x , y ≤ n

思路

 我们以以下样例来建一张图

样例:
10 0
1 2
1 3
2 4
2 5
3 6
3 7
4 8
4 9
8 10

        首先我们假定点1为根节点,求出所有节点到点1的最短距离dist[ j ]。 

        我们可以假设点1为根节点,往下深度优先遍历每一个节点,只有当某一个节点的所有子节点都被便利之后才会更新其祖先节点,所以在这个点 a 的所有子节点没有遍历结束之前, a 的所有子节点的祖先都是节点 a 。易得,当求的两个点 x , y 都是属于点 a 的孙子结点的时候,x与y的距离为dist[ i ] + dist[ j ] - dist[ a ] * 2;

代码 

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N = 20010, M = N * 2;

int n,m;
int h[N],e[M],w[M],ne[M],idx;
int res[N];
int dist[N];
int st[N];
int p[N];
vector<PII> query[N];

void add(int a,int b,int c)// 加点函数,使用邻接表储存该图
{
    e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx ++;
}

int find(int x)// 并查集板子
{
    if(p[x] != x) p[x] = find(p[x]);
    return p[x];
}

void dfs(int u,int fa)// 初始每个点到根节点的距离
{
    for(int i = h[u]; ~i ; i = ne[i])
    {
        int j = e[i];
        if(j == fa) continue;// 因为是无向边,所以会有一条边指向该点的父节点。
        dist[j] = dist[u] + w[i];// 子节点距离根节点的距离为父节点加上父节点到该点的距离
        dfs(j,u);//使用该点继续初始其他节点
    }
}

void tarjan(int u)// 该题核心函数
{
    st[u] = 1;
    for(int i = h[u];~i; i = ne[i])// 每个点的祖先都是它的父节点
    {
        int j = e[i];
        if(!st[j])
        {
            tarjan(j);// 以j为祖先节点,遍历所有j的所有子节点
            p[j] = u;//将点j的所有子节点遍历完成之后,就更新点j的祖先节点
        }
    }
    
    for(auto item : query[u])
    {
        int y = item.first,id = item.second;
        if(st[y] == 2)// 如果点y已经完成遍历,则可以进行求距离操作
        {
            int anc = find(y);
            res[id] = dist[u] + dist[y] - dist[anc] * 2;
        }
    }
    st[u] = 2;//表示该点祖先节点已经更新,且所有子节点都已经完成遍历
}

int main()
{
    cin >> n >> m;
    memset(h,-1,sizeof(h));
    for(int i = 1; i < n; i ++)//输入n-1条无向边
    {
        int a,b,c;
        cin >> a >> b >> c;
        add(a,b,c),add(b,a,c);
    }
    for(int i = 0; i < m; i ++)//输入m个询问
    {
        int a,b;
        cin >> a >> b;
        if(a == b) continue;
        query[a].emplace_back(b,i);
        query[b].emplace_back(a,i);
    }
    for(int i = 1; i <= n; i ++) p[i] = i;// 并查集初始化每个点所属的集合
    dfs(1,-1);// 假设点1为该树的根节点
    tarjan(1);
    for(int i = 0; i < m; i ++) cout << res[i] << endl;
    return 0;
}

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

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

相关文章

图数据库Neo4J 中文分词查询及全文检索(建立全文索引)

Neo4j的全文索引是基于Lucene实现的&#xff0c;但是Lucene默认情况下只提供了基于英文的分词器&#xff0c;下篇文章我们在讨论中文分词器&#xff08;IK&#xff09;的引用&#xff0c;本篇默认基于英文分词来做。我们前边文章就举例说明过&#xff0c;比如我要搜索苹果公司&…

【计算机网络笔记】ICMP(互联网控制报文协议)

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

利用自动化和条形码优化SAP制造供应链

背景 Welch Allyn 是全球领先的医疗诊断设备制造商&#xff0c;开发了数百种突破性产品和技术&#xff0c;使一线从业者能够提供卓越的患者护理。它拥有近 2,500 名员工&#xff0c;在 26 个不同的国家/地区工作。 挑战 提高运营效率 原因&#xff1a;用户需要长途跋涉并完成多…

C++单调向量算法:132 模式解法三枚举1

本题不同解法 包括题目及代码C二分查找算法&#xff1a;132 模式解法一枚举3C二分查找算法&#xff1a;132 模式解法二枚举2代码最简洁C二分查找算法&#xff1a;132 模式解法三枚举1性能最佳C单调向量算法&#xff1a;132 模式解法三枚举1 分析 时间复杂度 2轮循环时间复杂…

learning to rank 学习排名系统综述

Learning to Rank 的实践 文档列表方法 Listwise 算法相对于 Pointwise 和 Pairwise 方法来说&#xff0c;它不再将排序问题转化为一个分类问题或者回归问题&#xff0c;而是直接针对评价指标对文档的排序结果进行优化&#xff0c;如常用的 MAP、NDCG 等。应用 Listwise 的模型…

计算数组中每个元素的立方根numpy.cbrt()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算数组中每个元素的立方根 numpy.cbrt() [太阳]选择题 请问以下代码中执行语句输出结果是&#xff1f; import numpy as np a np.array([1, 8, 27]) print("【显示】a ",a) pr…

面试题-3

1.说一下原型链 原型就是一个普通对象,它是为构造函数实例共享属性和方法&#xff0c;所有实例中引用原型都是同一个对象 使用prototype可以把方法挂载在原型上&#xff0c;内存值保存一致 _proto_可以理解为指针,实例对象中的属性,指向了构造函数的原型(prototype) 2.new操…

魔众文库系统 v5.6.0 DWG文件格式支持,部分数据封面显示异常,定时调度清理临时文件

魔众文库系统基于文档系统知识&#xff0c;建立平台与领域&#xff0c;打造流量、用户、付费和变现的闭环&#xff0c;帮助您更好的搭建文库系统。 魔众文库系统发布v5.6.0版本&#xff0c;新功能和Bug修复累计17项&#xff0c;DWG文件格式支持&#xff0c;部分数据封面显示异…

SpringBoot-集成Kafka详解

SpringBoot集成Kafka 1、构建项目 1.1、引入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.5.RELEASE</version> </parent> <dependenci…

DevExpress中文教程 - 如何在macOS和Linux (CTP)上创建、修改报表(上)

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reports — 跨平台报表组件&#x…

AnimateDiff搭配Stable diffution制作AI视频

话不多说&#xff0c;先看视频 1. AnimateDiff的技术原理 AnimateDiff可以搭配扩散模型算法&#xff08;Stable Diffusion&#xff09;来生成高质量的动态视频&#xff0c;其中动态模型&#xff08;Motion Models&#xff09;用来实时跟踪人物的动作以及画面的改变。我们使用 …

[ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧

文章目录 一、Amazon CodeWhisperer 简介1.1 CodeWhisperer 是什么1.2 Amazon CodeWhisperer 是如何工作的 二、Amazon CodeWhisperer 的优势和功能2.1 Amazon CodeWhisperer 的优势2.2 Amazon CodeWhisperer 的代码功能 三、Amazon CodeWhisperer 安装3.1 安装到 IntelliJ IDE…

〖大前端 - 基础入门三大核心之JS篇㊱〗- JavaScript 的DOM节点操作

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

股票魔法师第二阶段趋势模板选股公式,寻找上涨趋势

对于股票运行的阶段&#xff0c;不同的股票分析方法有着不同的划分方式。从传统的主力运作分析&#xff0c;可以分为吸筹、洗盘、试盘、拉升、出货五个阶段。在波浪理论中&#xff0c;一个完整的上升或下降周期包含8浪&#xff08;其中5浪是主浪、3浪是调整浪&#xff09;。在缠…

Gdevops北京站 2023年全球敏捷运维峰会-核心PPT资料下载

一、峰会简介 2023 Gdevops全球敏捷运维峰会-北京站成功举办&#xff0c;一众产学研界技术大佬与新锐专家&#xff0c;以智能为主线&#xff0c;就数据库、运维、架构、金融科技等领域进行了前沿技术与实践经验交流&#xff0c;一同畅聊AIGC、云原生、数智化转型下的新机遇。 …

【LeetCode刷题-滑动窗口】--159.至多包含两个不同字符的最长子串

159.至多包含两个不同字符的最长子串 方法&#xff1a;滑动窗口 定义两个指针left和right作为窗口的边界&#xff0c;将两个指针都设定在位置0&#xff0c;然后向右移动right指针&#xff0c;直到窗口内不超过两个不同的字符&#xff0c;如果某一点我们得到了3个不同的字符&am…

市县镇一体化视频会议系统

随着网络技术的飞速发展&#xff0c;县市各部门建成了业务专用通信网络。利用专用通信网络&#xff0c;省一市-县基本上都开通了局域网视频会议系统。我们在市局各科室和各县局间建成了专网跨网段的视频会议系统。连通宝视频会议系统建设方案软硬一体&#xff0c;可实现多点间语…

基于STM32的蓝牙低功耗(BLE)通信方案设计与实现

蓝牙低功耗&#xff08;Bluetooth Low Energy&#xff0c;简称BLE&#xff09;是一种能够在低功耗环境下实现无线通信的技术。在物联网应用中&#xff0c;BLE被广泛应用于传感器数据采集、健康监测设备、智能家居等领域。本文将基于STM32微控制器&#xff0c;设计并实现一个简单…

⑧【MySQL】数据库查询:内连接、外连接、自连接、子查询、多表查询

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 内连接、外连接、自连接、子查询、多表查询 ⑧…

汽车ECU的虚拟化技术初探(三)--U2A虚拟化辅助功能分析1

目录 1.基本概述 1.1 U2A虚拟化辅助功能 1.2 U2A虚拟化使能和资源分配 2. U2A架构概述 3. CPU运行模式 3.1 虚拟化模式 3.2 限制运行模式 3.3 权限运行模式 3.4 CPU运行模式小结 4.小结 1.基本概述 1.1 U2A虚拟化辅助功能 在汽车ECU的虚拟化技术初探(二)-CSDN博客中…