【HDU No. 2586】 树上距离 How far away ?

news2025/7/21 4:35:10

【HDU No. 2586】 树上距离 How far away ?

杭电 OJ 题目地址

在这里插入图片描述

【题意】

有n 栋房屋,由一些双向道路连接起来。

每两栋房屋之间都有一条独特的简单道路(“简单”意味着不可以通过两条道路去一个地方)。人们每天总是喜欢这样问:“我从A房屋到B房屋需要走多远?”

【输入输出】

输入:

第1行是单个整数T (T ≤10),表示测试用例的数量。每个测试用例的第1行都包含n (2≤n ≤40000)和m (1≤m ≤200),表示房屋数量和查询数量。下面的n -1行,每行都包含三个数字i、j、k ,表示有一条道路连接房屋i 和房屋j ,长度为k (0<k≤40000),房屋被标记为1~n 。

接下来的m 行,每行都包含两个不同的整数i 和j ,求房屋i 和房屋j 之间的距离。

输出:

对每个测试用例,都输出m 行查询答案,在每个测试用例后都输出一个空行。

【样例】

在这里插入图片描述

【思路分析】

这道题中任意两个房子之间的路径都是唯一的,是连通无环图,属于树形结构,所以求两个房子之间的距离相当于求树中两个节点之间的距离。

可以采用最近公共祖先LCA的方法求解。求解LCA的方法有很多,在此使用树上倍增+ST解决。

【算法设计】

① 根据输入数据采用链式前向星存储图。

② 深度优先搜索,求深度、距离,初始化F[v ][0]。

③ 创建ST。

④ 查询x 、y 的最近公共祖先lca。

⑤ 输出x、y 的距离dist[x ]+dist[y ]-2×dist[lca]。

【举个栗子】

求u 和v 之间的距离,若u 和v 的最近公共祖先为lca,则u 和v之间的距离为u 到树根的距离加上v 到树根的距离,再减去2倍的lca到树根的距离:dist[u ]+dist[v ]-2×dist[lca]。

在这里插入图片描述

【算法实现】

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

const int maxn = 40005;

int n , m;
int head[maxn] , dis[maxn] , cnt; // 头节点,距离
int fa[maxn] , ans[maxn];

bool vis[maxn];
vector<int> query[maxn] , query_id[maxn]; //查询及编号

struct Edge{
	
	int to , c , next;
}e[maxn << 1];

void add(int u , int v , int w){
	
	e[++cnt].to = v;
	e[cnt].c = w;
	e[cnt].next = head[u];
	head[u] = cnt;
} 

void add_query(int x , int y , int id){
	
	query[x].push_back(y);
	query_id[x].push_back(id);
	query[y].push_back(x);
	
	query_id[y].push_back(id);
}

int find(int x){ //并查集找祖宗 
	
	if(x != fa[x]){
		
		fa[x] = find(fa[x]);
	}
	
	return fa[x];
}

void tarjan(int u){
	
	vis[u] = 1;
	for(int i = head[u] ; i ; i = e[i].next){
		
		int v = e[i].to , w = e[i].c;
		if(vis[v]){
			
			continue;
		}
		dis[v] = dis[u] + w;
		tarjan(v);
		
		fa[v] = u;
	}
	
	for(int i = 0  ; i < query[u].size(); i ++){ //u相关的所有查询 
		
		int v = query[u][i];
		int id = query_id[u][i];
		
		if(vis[v]){
			
			int lca = find(v);
			ans[id] = dis[u] + dis[v] - 2 * dis[lca];
		}
	}
}

int main(){
	
	int x, y , T , lca;
	
	cin >> T;
	while(T--){
		
		cin >> n >> m;
		for(int i = 1; i <= n ; i++){ // 初始化 
			
			head[i] = vis[i] = dis[i] = 0;
			fa[i] = i;
			
			query[i].clear();
			query_id[i].clear();
		}
		
		cnt = 0;
		for(int i = 1; i < n; i ++){ //输入一棵树的 n - 1边 
			
			int x ,y ,z;
			cin >> x >> y >> z;
			
			add(x , y , z);
			add(y , x , z);
		}
		
		for(int i = 1; i <= m ; i ++){
			
			cin >> x >> y;
			if(x == y){
				
				ans[i] = 0;
			}else{
				
				add_query(x , y , i);
			}
		}
		tarjan(1);
		for(int i = 1; i<= m ; i++){
			
			cout << ans[i] << endl; //输出x 、 y 的距离 
		}
	}
	
	return 0;
}

在这里插入图片描述

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

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

相关文章

CUDA——向量化内存

许多 CUDA 内核受带宽限制&#xff0c;新硬件中触发器与带宽的比率增加导致更多带宽受限内核。 这使得采取措施缓解代码中的带宽瓶颈变得非常重要。 在本文中&#xff0c;我将向您展示如何在 CUDA C/C 中使用矢量加载和存储来帮助提高带宽利用率&#xff0c;同时减少执行指令的…

【附源码】计算机毕业设计JAVA疫情社区志愿者组织的资源管理平台

【附源码】计算机毕业设计JAVA疫情社区志愿者组织的资源管理平台 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#…

Rust权威指南配套手把手笔记

Rust权威指南配套手把手笔记 持续更新ing 共20章&#xff0c;110小节 P1 1.1 - 简介 06:46 P2 1.2 - 安装 Rust 03:18 P3 1.3 - Hello World 04:11 P4 1.4 - Hello Cargo 07:49 P5 2.1 - 猜数游戏&#xff1a;一次猜测 11:47 P6 2.2 - 猜数游戏&#xff1a;生成神秘数字 …

【强化学习论文合集】ICLR-2021 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

Grad-CAM

其实还是关于yolo的 利用Grad-CAM解释目标检测框架 研究者研究了视觉物体检测器的可解释性问题。具体来说&#xff0c;研究者在YOLO目标检测器的示例中演示了如何将Grad-CAM集成到模型架构中并分析结果。最后展示了如何计算个体检测的基于归因的解释&#xff0c;并发现结果的归…

Biotin-PEG2-alkyne|紫外线可裂解生物素-二聚乙二醇-炔烃|提供光谱图

试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; 紫外线可切割生物素-PEG2-炔烃含有紫外线可切割碎片(containsa UV cleavable Fragemnt)&#xff0c;试剂通过点击化学与含叠氮化物的分子反应。点击化学生物素标记试剂包含各种点…

深入浅出PyTorch——PyTorch可视化

1. 可视化网络结构 在复杂的网络结构中确定每一层的输入结构&#xff0c;方便我们在短时间内完成debug 1.1 使用print函数打印模型基础信息 使用ResNet18的结构进行展示 import torchvision.models as models model models.resnet18() print(model)#打印结果 ResNet((conv1)…

算法学习 | 深度优先搜索~一条道走到黑

目录 员工的重要性 图像渲染 岛屿的周长 被围绕的区域 岛屿数量 深度优先搜索(Depth First Search)&#xff1a;深度优先搜索属于图算法的一种&#xff0c;其过程主要是对每一个可能的分支路径深入到不能再深入到为止&#xff0c;而且每个节点只能访问一次。深度优先搜…

[毕业设计]机器学习的运动目标跟踪-opencv

目录 前言 课题背景和意义 实现技术思路 第一步&#xff1a;创建单目标追踪器 第二步&#xff1a;读取视频的第一帧 第三步&#xff1a;在第一帧中定位物体 第四步&#xff1a;初始化多目标追踪器 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边…

leetcode 907. Sum of Subarray Minimums(子数组最小值的和)

所有子数组的最小值求和。 思路&#xff1a; 最容易想到的就是用DFS找出所有子数组&#xff0c;然后每个子数组找最小值&#xff0c;再求和。但显然不是最优的。 因为费尽心思找到了一堆子数组&#xff0c;它们的最小值竟然是相同的&#xff0c; 是不是有种直接用这个最小值乘…

Alkyne-PEG-Biotin,Alk-PEG-Biotin,炔烃-聚乙二醇-生物素试剂供应

英文&#xff1a;Alkyne-PEG-Biotin&#xff0c;Alk-PEG-Biotin 中文&#xff1a;炔烃-聚乙二醇-生物素 CAS编号&#xff1a;N/A 所属分类&#xff1a;Alkyne PEG Biotin PEG 分子量&#xff1a;可定制&#xff0c;生物素-聚乙二醇5-炔烃、生物素-PEG 20-炔烃 、Biotin-PEG…

HCIA 访问控制列表ACL

一、前言 ACL又称访问控制列表&#xff0c;其实这个东西在很多地方都有用&#xff0c;可能名字不太一样但原理和功能都差不太多&#xff0c;比如服务器、防火墙&#xff0c;都有类似的东西&#xff0c;功能其实也就是“过滤”掉不想收到的数据包。为什么不想收到一些数据包呢&…

C++ 测试框架 Gtest学习——qt版本

目录标题一、参考文档二、获取Gtest三、使用&#xff08;一&#xff09;qt项目导入Gtest&#xff08;二&#xff09;修改pro文件&#xff08;三&#xff09;一个简单的例子&#xff08;四&#xff09;EXPECT&#xff08;期望&#xff09;和ASSERT&#xff08;断言&#xff09;介…

ImportError: cannot import name ‘xxx‘ from ‘xxx‘关于python导包的问题

github clone下来的代码&#xff0c;在矩池云跑的好好的&#xff0c;在自己电脑跑却报错。 ImportError: cannot import name ‘helper’ from ‘utils’ (D:\anaconda\envs\TF2.1\lib\site-packages\utils_init_.py) 搜了网上&#xff0c;说加路径 import sys sys.path.appe…

力控关节机器人(关节扭矩传感器力控)

力控机器人本质上属于协作机器人中的一种&#xff0c;其每个关节都带有力矩传感器&#xff1b; [1] 广泛应用在工业、医疗、新零售领域或智能厨房行业。 Franka Emika&#xff1a; 力控机器人每个关节都带有力矩传感器 力矩传感器提供了一种提高机器人力控性能的途径。 更加…

[毕业设计]基于机器视觉的车辆速度检测与识别算法

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投…

面板平滑转换回归(PSTR)分析案例实现

建模过程包括三个阶段&#xff1a;表述&#xff0c;估计和评估&#xff0c;本文帮助用户进行模型表述、估计&#xff0c;进行PSTR模型评估。 最近我们被客户要求撰写关于PSTR的研究报告&#xff0c;包括一些图形和统计输出。 在程序包中实现了集群依赖性和异方差性一致性检验…

电脑删除的照片怎么找回来?总结了四种方法

照片被删除似乎是常有的事情&#xff0c;如果是重要的照片被删了&#xff0c;想要办法恢复才是最重要的。而对于删除的照片您是如何恢复的呢&#xff1f;这里总结了几种恢复方法&#xff0c;根据自己的需要选择恢复方法&#xff0c;不出意料的话&#xff0c;按照下面的方法你将…

以分割栅格为例实现FME模板的方案优化

一、利用FME分割栅格 &#xff08;一&#xff09;问题的产生 对于FME使用者来说&#xff0c;利用FME完成栅格的批量分割是一件极为平常且容易的事情。只需要输入栅格和确定分割方案就可以实现利用FME对栅格数据的分割&#xff0c;再配合FME的“扇出”功能&#xff0c;就能够实…

WebDAV之葫芦儿·派盘+多彩笔记

多彩笔记 支持webdav方式连接葫芦儿派盘。 还记得小时候那款带密码锁的笔记本?有没有好用的笔记app可以将笔记加上密码,不怕小秘密被偷看?推荐朋友们体验下多彩笔记。 多彩笔记是一款简单又精致的记事软件,用户可以在多彩笔记app中存储,编辑,删除或查找记录,对于写作…