0

0

C++怎么实现Kruskal重构树_C++图论进阶教程【结构】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-08 08:17:02

|

773人浏览过

|

来源于php中文网

原创

kruskal重构树需新建虚点并重定向父指针,仅排序边得到的是mst而非重构树;虚点权为边权,父子关系由并查集合并顺序决定,叶子为原图节点(1~n),内部节点为虚点(n+1~2n−1)。

c++怎么实现kruskal重构树_c++图论进阶教程【结构】

为什么 Kruskal 重构树不能直接用 std::sort 排完边就完事

因为重构树本质是建一棵新树,不是单纯求 MST;原图的边权要变成新树的点权,而父子关系由并查集合并顺序决定。跳过「虚点创建」和「并查集父指针重定向」这两步,得到的只是 MST 的边集,不是重构树结构。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 每轮 union 合并两个连通块时,必须新建一个虚点(编号从 n+1 开始),该点权值 = 当前边权
  • 并查集的 parent 数组不能只存根,得额外维护 tree_parent:虚点的父节点是这次合并后的新根(即新虚点),两个旧根都连向它
  • 别复用原图的 find 函数返回值当树节点——它返回的是集合代表元,不是重构树上的实际节点编号

怎么给重构树打标记:DFS 序 + 线段树还是倍增 LCA

重构树是二叉树(每个虚点恰好合并两个子树),但不一定是满二叉树;它的核心价值在于:原图中两点路径最大边权 ≤ x,等价于它们在重构树上的 LCA 权值 ≤ x。所以标记/查询通常围绕 LCA 展开。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 如果只做「单次询问两点是否可达(限权)」,不用建任何数据结构,直接倍增跳 lca,比较 weight[lca] 和阈值即可
  • 如果要做「所有满足 weight[u] ≤ x 的 u 的子树大小」,就得 DFS 求出进出时间戳,再上线段树或树状数组
  • 注意:重构树的叶子节点对应原图的点(编号 1~n),内部节点才是虚点(编号 n+1 ~ 2n−1),初始化线段树时叶子位置要映射对

std::vector<:pair int>></:pair> 存边够不够,要不要上 struct Edge

够,但容易漏信息。Kruskal 重构树需要同时访问边权、端点、以及后续用于构建树的「处理顺序」,用裸 pair 容易在排序后丢掉原始索引或混淆方向。

Anyword
Anyword

AI文案写作助手和文本生成器,具有可预测结果的文案 AI

下载

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 定义 struct Edge { int u, v, w, id; };id 不为序号而是为了调试时定位哪条边触发了哪个虚点创建
  • 排序用 std::sort(edges.begin(), edges.end(), [](auto& a, auto& b) { return a.w ,别手写比较函数漏 const 引用,否则大数组下性能暴跌
  • 别把边存在 vector<vector int>>></vector> 邻接表里——重构树不需要原图邻接关系,存了纯占内存

重构树建完发现跳 lca 返回 0 或越界,常见原因

基本是节点编号没对齐,或者并查集初始化范围错了。重构树总节点数是 2 * n - 1,但很多人只开了 n + m 大小的数组。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 数组如 fa(并查集)、depup(倍增父节点)、w(点权)都要开到 2 * n,下标从 1 开始用
  • 并查集初始化:前 n 个点是原图节点,fa[i] = i;虚点初始不进并查集,只在合并时动态加入
  • DFS 建倍增表时,确保只遍历重构树的有效边(即你手动建的 tree_adj),别误扫原图边或未连接的虚点

重构树真正难的不是建树本身,是后续查询时搞混「原图节点」和「虚点」的语义,比如对虚点调用 query_subtree_size 却忘了它没有原图物理意义,或者把 w[lca] 当成路径边数——它永远是某条原边的权值,仅此而已。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

1711

2023.08.21

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

396

2024.03.05

如何解决Edge打开但没有标题的问题
如何解决Edge打开但没有标题的问题

若 Microsoft Edge 浏览器打开后无标题(窗口空白或标题栏缺失),可尝试以下方法解决: 重启 Edge:关闭所有窗口,重新启动浏览器。 重置窗口布局:右击任务栏 Edge 图标 → 选择「最大化」或「还原」。 禁用扩展:进入 edge://extensions 临时关闭插件测试。 重置浏览器设置:前往 edge://settings/reset 恢复默认配置。 更新或重装 Edge:检查最新版本,或通过控制面板修复

1031

2025.04.24

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

409

2023.09.04

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

558

2023.09.20

c语言union的用法
c语言union的用法

c语言union的用法是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,union的使用可以帮助我们节省内存空间,并且可以方便地在不同的数据类型之间进行转换。使用union时需要注意对应的成员是有效的,并且只能同时访问一个成员。本专题为大家提供union相关的文章、下载、课程内容,供大家免费下载体验。

129

2023.09.27

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

970

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

605

2024.08.29

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.8万人学习

C 教程
C 教程

共75课时 | 5.2万人学习

C++教程
C++教程

共115课时 | 20.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号