题目分析
本题是一道最大生成树 + 树上倍增 LCA的综合应用题。
货车在两点间运输的最大载重,等价于两点间所有路径中最小边权的最大值,这是经典的瓶颈路径问题。
最大生成树能保留图中所有节点的连通性,且任意两点间的唯一路径,就是原图中瓶颈路径(最小边权最大的路径)。因此我们先构建图的最大生成树,再通过树上倍增预处理树的信息,快速查询每对节点间路径的最小边权,即为答案;若两点不连通,输出 - 1。
算法思路
1.Kruskal 算法构建最大生成树
将所有边按权值从大到小排序,用并查集维护连通性,依次加入不形成环的边,最终得到最大生成树。
2.树上倍增预处理
通过 DFS 遍历生成树,预处理每个节点的2^k 级祖先和到 2^k 级祖先路径上的最小边权,同时记录节点深度。
3.倍增 LCA 查询答案
对于每组查询,先判断两点是否连通;若连通,利用倍增法找到两点的最近公共祖先,同步计算路径上的最小边权,即为最大载重。
实践效果
最大生成树将原图的多路径问题简化为树的单一路径问题,保证查询结果为最优解。
最终查询函数直接返回路径最小边权,不连通返回 - 1,匹配题目要求。
示例代码
复杂度分析
时间复杂度:
O(mlogm+nlogn+qlogn),mlogm为边排序时间,nlogn为 DFS 预处理时间,qlogn为查询总时间。
空间复杂度:
O(nlogn+m),主要为倍增数组和邻接表开销。
易错点提醒
1.最大生成树必须按边权降序排序,若升序会变成最小生成树,答案错误。
2.倍增数组maxw存储的是路径最小边权,转移时必须用min更新。
3.DFS 初始化时,根节点的父节点设为 0,边权初始值要正确赋值。
4.查询时必须先判断两点是否在同一连通块,否则直接返回 - 1。
sx : aaa算是第一次公开发题解,刚注册的ACGO,初来乍到的初中生,还请多多包容和指点!
可以在我的团队看看孩子别的题解(平时周156上线)