【ybtoj 4.5 倍增问题课堂过关】【洛谷P1967】D. 货车运输【LCA+最大生成树】

本文探讨了图论中的经典问题,通过Kruskal算法构建最小生成树,并利用LCA(最近公共祖先)解决静态树上的权值查询。文章详细解释了如何维护从节点出发的最小路径,并给出C++实现代码,适用于解决两点间最短路径的问题。
摘要由CSDN通过智能技术生成

在这里插入图片描述
题目链接:洛谷ybtoj

分析

当两个城市可以互相到达的时候,最优路线一定位于原图的最大生成森林上,这个可以通过反证法证明。

这题是LCA经典应用:静态树上链的权值查询问题。

因为两点间的路径肯定就要走到LCA。只要在求LCA的时候,往上跳一次就更新一次最小值即可,也就是 a n s = m i n ( a n s , m i n ( d i s [ x ] [ i ] , d i s [ y ] [ i ] ) ) ; ans=min(ans,min(dis[x][i],dis[y][i])); ans=min(ans,min(dis[x][i],dis[y][i]));,这句要放在 x , y x,y x,y 更新之前。

d i s [ i , j ] dis[i,j] dis[i,j]表示从 i i i出发向上走 2 j 2^j 2j 步的所有点的边权最小值。转移: d i s [ i , j ] = m i n ( d i s [ i , j − 1 ] , d i s [ f [ i , j − 1 ] , j − 1 ] ) dis[i,j]=min(dis[i,j-1],dis[f[i,j-1],j-1]) dis[i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值