【HDU2586】How far away ?【LCA】

HDU---2586:How far away?【三种方法求LCA】 题目: HDU---2586:How far away? 题意: 给定一颗树,求任意两点之间的距离 分析: (1)倍增求LCA: 定义dp[u][x]表示u这个节点向上跳2^x步到达的节点,不包括本身,那么dp[u][0] = fa[u],dfs一遍处理出深度数组deep[u]和dp[u][0]和u到根节点的距离dis[u],求LCA(u,v)时,先使u,v位于同一深度,然后一起向上倍... 阅读详情

题目大意:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586
给出一棵树,每条边上有边权,求 x [ i ] x[i] x[i]到 y [ i ] y[i] y[i]的路径边权之和。


思路:

LCA模板题。
因为我们知道,任意两点 x x x和 y y y的距离= x x x到根的距离 + y +y +y到根的距离 − 2 × l c a ( x , y ) -2\times lca(x,y) −2×lca(x,y)到根的距离。例如:
在这里插入图片描述
如果我们要求点 4 4 4和点 7 7 7的路径之和,我们可以先找到他们的 L C A LCA LCA点 2 2 2,然后就有
d i s [ 4 ] [ 7 ] = d i s [ 1 ] [ 4 ] + d i s [ 1 ] [ 7 ] − 2 × d i s [ 1 ] [ 2 ] dis[4][7]=dis[1][4]+dis[1][7]-2\times dis[1][2] dis[4][7]=dis[1][4]+dis[1][7]−2×dis[1][2]
为什么是这样呢?
首先我们把 d i s [ 4 ] [ 7 ] dis[4][7] dis[4][7]分解成 d i s [ 2 ] [ 4 ] + d i s [ 2 ] [ 7 ] dis[2][4]+dis[2][7] dis[2][4]+dis[2][7]。
d i s [ 1 ] [ 4 ] = d i s [ 2 ] [ 4 ] + d i s [ 1 ] [ 2 ] dis[1][4]=dis[2][4]+dis[1][2] dis[1][4]=dis[2][4]+dis[1][2]
d i s [ 1 ] [ 7 ] = d i s [ 2 ] [ 7 ] + d i s [ 1 ] [ 2 ] dis[1][7]=dis[2][7]+dis[1][2] dis[1][7]=dis[2][7]+dis[1][2]
那么 d i s [ 1 ] [ 4 ] + d i s [ 1 ] [ 7 ] = d i s [ 2 ] [ 4 ] + d i s [ 2 ] [ 7 ] + 2 × d i s [ 1 ] [ 2 ] dis[1][4]+dis[1][7]=dis[2][4]+dis[2][7]+2\times dis[1][2] dis[1][4]+dis[1][7]=dis[2][4]+dis[2][7]+2×dis[1][2]
这正好比 d i s [ 4 ] [ 7 ] dis[4][7] dis[4][7]多了 2 × d i s [ 1 ] [ 2 ] 2\times dis[1][2] 2×dis[1][2]
所以再减去 2 × d i s [ 1 ] [ 2 ] 2\times dis[1][2] 2×dis[1][2]即可。

那么同理,如果我们要求 x x x到 y y y的距离,我们先设他们的 L C A LCA LCA为 l c a lca lca,这棵树的根节点为 r o o t root root,那么就有:
d i s [ x ] [ y ] = d i s [ x ] [ l c a ] + d i s [ y ] [ l c a ] dis[x][y]=dis[x][lca]+dis[y][lca] dis[x][y]=dis[x][lca]+dis[y][lca]
d i s [ r o o t ] [ x ] = d i s [ x ] [ l c a ] + d i s [ r o o t ] [ l c a ] dis[root][x]=dis[x][lca]+dis[root][lca] dis[root][x]=dis[x][lca]+dis[root][lca]
d i s [ r o o t ] [ y ] = d i s [ y ] [ l c a ] + d i s [ r o o t ] [ l c a ] dis[root][y]=dis[y][lca]+dis[root][lca] dis[root][y]=dis[y][lca]+dis[root][lca]
d i s [ r o o t ] [ x ] + d i s [ r o o t ] [ y ] = d i s [ x ] [ l c a ] + d i s [ y ] [ l c a ] + 2 × d i s [ r o o t ] [ l c a ] dis[root][x]+dis[root][y]=dis[x][lca]+dis[y][lca]+2\times dis[root][lca] dis[root][x]+dis[root][y]=dis[x][lca]+dis[y][lca]+2×dis[root][lca]
d i s [ x ] [ y ] = d i s [ r o o t ] [ x ] + d i s [ r o o t ] [ y ] − 2 × d i s [ r o o t ] [ l c a ] dis[x][y]=dis[root][x]+dis[root][y]-2\times dis[root][lca] dis[x][y]=dis[root][x]+dis[root][y]−2×dis[root][lca]
那么对于所有的 x [ i ] x[i] x[i]和 y [ i ] y[i] y[i],我们就求出他们的 L C A LCA LCA,然后按照公式输出即可。


代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 50100
#define LG 20
using namespace std;

int t,n,m,tot,f[N][LG],dep[N],head[N],dis[N];

struct edge
{
	int next,to,dis;
}e[N*2];

void add(int from,int to,int dis)
{
	e[++tot].to=to;
	e[tot].dis=dis;
	e[tot].next=head[from];
	head[from]=tot;
}

void dfs(int x,int fa,int k)  //预处理出f数组和任一点到root的距离
{
	dep[x]=dep[fa]+1;
	dis[x]=k;  //dis[x]表示点x到root的距离
	for (int i=1;i<=LG;i++)
	 f[x][i]=f[f[x][i-1]][i-1];
	for (int i=head[x];~i;i=e[i].next)
	 if (e[i].to!=fa)
	 {
	 	f[e[i].to][0]=x;
	 	dfs(e[i].to,x,k+e[i].dis);
	 }
}

int lca(int x,int y)
{
	if (dep[x]<dep[y]) swap(x,y);
	for (int i=LG;i>=0;i--)  //跳到同一高度
	 if (dep[f[x][i]]>=dep[y]) x=f[x][i];
	if (x==y) return x;
	for (int i=LG;i>=0;i--)  //继续跳
	 if (f[x][i]!=f[y][i])
	 {
	 	x=f[x][i];
	 	y=f[y][i];
	 }
	return f[x][0];
}

int main()
{
	scanf("%d",&t);
	while (t--)
	{
		memset(head,-1,sizeof(head));
		tot=0;
		scanf("%d%d",&n,&m);
		int x,y,z;
		for (int i=1;i<n;i++)
		{
			scanf("%d%d%d",&x,&y,&z);
			add(x,y,z);
			add(y,x,z);
		}
		dfs(1,0,0);
		for (int i=1;i<=m;i++)
		{
			scanf("%d%d",&x,&y);
			z=lca(x,y);
			printf("%d\n",dis[x]+dis[y]-dis[z]-dis[z]);
		}
	}
	return 0;
}
别再傻傻分不清!5分钟搞懂倾斜摄影里‘地面分辨率’和‘模型精度’到底啥关系 本文深入解析倾斜摄影中‘地面分辨率’与‘模型精度’的关系,帮助读者快速理解两者的本质区别与内在关联。通过实战案例和公式计算,详细说明如何从航飞设计到精度验证全流程控制,避免常见认知误区,并针对不同应用场景提供精度需求建议。 阅读详情

相关推荐

【调试记录】GT ip跑aurora 64b66b协议

如果不用,会出现这种情况:自回环测试,数据收发ok.一旦和对方通信,对方接收的就是一堆乱码,因为GT链路发送数据不能是全1或全0,或者长时间的1或0.否则线路容易受到干扰,毕竟线速率10多G,用了加扰和解扰,就可以提高抗干扰能力。64B66B编码,数据输入是64bit,输出是66bit,所以这之间存在着2bit的带宽差,Gearbox 就是用来解决这种差异的,实现方式是:将66bit数据拿出来2bit先存入Gearbox,然后输出64bit.发送同步码或控制数据时,配置成2.2.4 加扰和解扰!

weixin_41246509的博客 1601

HDU - 2586 - How far away ? (最短路)

HDU - 2586 - How far away ? (最短路) There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this “How far is it if I want to go from house...

weixin_43179892的博客 292

相机标定-张正友棋盘格标定法

(X,Y,Z)为在世界坐标系下一点的物理坐标 ( u , v ) 为该点对应的在像素坐标系下的像素坐标 引入齐次坐标的原因:引入齐次坐标的目的是为了升维,将坐标从二维坐标变为三维坐标。 2.相机成像过程 相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。 (1)世界坐标系(,,) 描述目标在真实世界中的位置引入的参考坐标系。 (2)相机坐标系(,,) ...

qq_41275123的博客 1万+

hdu2586How far away ?【LCA tarjan求最短距离】

这个题比普通的LCA只多了一个求距离,然后就把我华丽丽的困住了== 当然了,我用的LCA是离线版的并查集那种模板是邝斌的那种,LCA 不难理解,就是dfs树+并查集 ,但是距离加在哪里?? 机智如我想到了在递归的时候求~然而写进去还找错位置了,原因在于应该写成dis[v]=dis[u]+edge[i].len;而不是dis[v]+=edge[i].len; 然后就是距离的求法dis[u] +

MissZhou要努力 1280

UI-TARS桌面版模型部署

在 UI-TARS 中配置 VLM(视觉语言模型)模型,无论是选择云端(Hugging Face)还是本地(vLLM)部署,都需要经过一系列步骤,下面为你详细展开介绍。

二琳爱吃肉的博客 4538

基于FPGA的CORDIC算法实现——Verilog版

目前,学习与开发FPGA的程序员们大多使用的是Verilog HDL语言(以下简称为Verilog),关于Verilog的诸多优点一休哥就不多介绍了,在此,我们将重点放在Verilog的运算操作上。 我们都知道,在Verilog中,运算一般分为逻辑运算(与或非等)与算术运算(加减乘除等)。而在一开始学习Verilog时,老司机一定会提醒我们,“切记,千万别用‘/’除、‘%’取模(有的也叫取余)和‘

善良の一休君的博客 6万+

HDU #2586. how far away

题意 求树上2点间距离 题解 LCA dis[u][v] = dis[root][u] + dis[root][v] - 2 * dis[root][lca] 调试记录 无 #include &lt;cstdio&gt; #include &lt;algorithm&gt; #include &lt;cstring&gt; const int maxn = 4 * 1e4 + 5; const i...

时间次元的博客 177

2022年全国职业院校技能大赛高职组大数据技术与应用赛项赛卷⑩—解析答案

工业互联网是工业全要素、全产业链、全价值链的全面连接,是人、机、物、工厂互联互通的新型工业生产制造服务体系,是互联网从消费领域向生产领域、从虚拟经济向实体经济拓展的核心载体,是建设现代化经济体系、实现高质量发展和塑造全球产业竞争力的关键支撑。加快发展工业互联网产业,不仅是各国顺应产业发展大势,抢占产业未来制高点的战略选择,也是我国推动制造业质量变革、效率变革和动力变革,实现高质量发展的客观要求。 为完成工业大数据分析工作,你所在的小组将应用大数据技术,以Scala作为整个项目的基础开发语言,基于大数据平台综

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 581

hdu 2586 How far away ? lca求最短路

给定一棵n个结点的树,有m个询问,问a,b之间的最短路是多少?。 设dis[x]为树根到x节点的路程,所以只要求出a,b的lca,答案就是dis[a]+dis[b]-2*dis[lca(a,b)] dis的记录在遍历树的时候可以求得。 #include #include #include #include #include #include #include #include

熟睡的哲学家的博客 477

《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存

如何读取ECU中指定内存地址的数据?图解UDS 0x23服务带你快速上手!!

车载系统攻城狮 2623

Android 14.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

在14.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析实现这个功能

安卓兼职framework和app工程师的博客 1310

How far away ?

How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19131    Accepted Submission(s): 7485 Problem Description There are n ho

dreamjay1997的博客 805

CDD数据库文件制作(十一)——服务配置(0x19_DTC Code)

虽然选择Copy和Reference都可以加载DTC,但是如果我们在DTC库中有修改DTC,通过Copy的方式加载的DTC在DTC Table中不会跟着DTC库的修改而自动更新。通过Reference的方式加载的DTC可以自动更新。找到Fault Memory的DTC Table,鼠标放在DTC Table区域,右键点击选择Copy …根据需要(客户协议)勾选响应的19服务子功能。如何创建一个新的DTC code?按照字母与下方要素可做一一对应。首先在DTC库中新建DTC。支持10 01/10 03。

LOVE135149的博客 1917

hdu2586 How far away? LCA

hdu2586 #include #include #include #include using namespace std; #define MAX 40000 struct edge{ int v,w; }; vector mp[MAX]; vector query[MAX]; bool flag[MAX]; int pre[MAX],father[MAX],path[MAX]

Time flies 1943

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HDU2586 How far away? —— 倍增LCA

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16425    Accepted

A man can be destroyed, but not defeated. 471

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

hdu 2586 How far away ?倍增LCA

hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增求取LCA,同时跟新距离数组 因为 \(2^{16} > 40000\) 所以所以表示祖先的数组dp[][]第二维取到16即可 就这道题来说,与比较tarjan比较,稍快一点 代码:...

ddqb3235的博客 234

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HDU 2586 How far away ? LCA

一、内容 There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house B"? Usually it h...

Tizzi的博客 914

HDU2586 How far away ?【LCA+并查集】

How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 33479 Accepted Submission(s): 13542 Problem Description There are n houses in...

海岛Blog 636

HDU 2586 How far away ? tarjan算法求LCA

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:有n个顶点,n - 1条双向边构成树,每条边都有权值,有m个查询,求每个查询两点之间的最小权值 思路:很久很久以前学最短路时用dijkstra把这题过了。。。用LCA求的话,求出从根节点到每个点之间的权值和,用dist[i]表示,那么对于查询(v, u)就有 dist[v,

弱智就要多努力 913

【HDU 2586 How far away ?】 LCA模板题

hdu 2586 给你一颗树 树上两点之间有有权边 给你m个询问 问你 a b 两个点之间距离是多少 我们用dis数组统计从起点到每个点的距离长度 那么容易知道 dis(a,b) = dis[a] - dis[b] - 2*dis[LCA(a,b)] O(nlogn + mlogn) /* if you can't see the repay Why not just work s...

我是谁 --- 卡比兽 165

HDU 2586 How far away ?【LCA】

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2586 ★就是这题让我入坑了 LCA ,目前只会 倍增法求LCA ,所以题解也是用的倍增法(不过我看其他题解没看到用倍增的) 思路: 先 不考虑点之间的距离(设每个点的距离为1)假设要 求 点a到点b 的距离,且已知 点a和点b 的LCA是 点t 现在用dep[ i ]表示点i的深度,那么 点a到点...

HungTeen的博客 193

【LCA最近公共祖先】HDU 2586 How far away ?

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586

F丶轩 708

倍增法LCA hdu2586 How far away ?

传送门:点击打开链接 题意:给你一棵树,每条边有权值,求两点之间的最短距离 思路:裸LCA。这里主要练习一下倍增法,感觉这种思路和代码实现很简单,而且能感觉实用性很大的,很值得学习 倍增法要理解对2的次方的枚举顺序 如果是要走固定步数,那么顺序枚举与i位与为1就行 如果是要求一个临界位置,那么要从大到小枚举 #include #include #include #include #

qwb的博客 1524

【lca】hdu2586 How far away ?

How far away ? Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 36072Accepted Submission(s): 14721 Problem Description There are n houses in the village and some bidirectional roads connectin...

andyc_03的博客 125

HDU2586——How far away ?(LCA模板)

How far away ? 题意:给出一棵树,问两个节点x,y之间的最短距离是多少(边权值)。 思路:用根节点到x的距离+根节点到y的距离−多走的距离根节点到x的距离+根节点到y的距离-多走的距离根节点到x的距离+根节点到y的距离−多走的距离 其中多走的距离要用LCA解决。 LCALCALCALCALCALCALCA求解方法1.欧拉序+++线段树或RMQ欧拉序RMQ(线段树)2.Tarjan LCALCALCA LCALCALCA只是一个概念,它的是一棵树上的两个节点的最近公共祖先。当然,它也是一个节点。

weixin_45363113的博客 607

HDU-2586 How far away ?(Tarjian_LCA)

HDU-258 How far away ? 题目 给一颗树,及其每条边权值,求多组两点最短路径, 分析 树上两点最短路径可以先把每个节点到跟节点的权值dis求出,设rt为u,v的LCA。 u,v最短路径 : dis[u]+dis[v]−2∗dis[rt]dis[u] + dis[v] - 2 * dis[rt]dis[u]+dis[v]−2∗dis[rt] 我用的离线Tarjian算法,所以要先...

Stormjing的博客 332
上一篇: 【JZOJ5776】小x游世界【换根法】【DP】【DFS】
下一篇: 【洛谷P2420】让我们异或吧【DFS】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值