当前位置: 首页 > news >正文

数据结构:最小生成树

1.基本概念

  • 生成树:连通无向图的生成树是包含图中所有顶点的极小连通子图(无环)。

  • 最小生成树:所有生成树中边权重总和最小的那棵。

2.常用算法

克鲁斯卡尔算法(Kruskal)
  1. 步骤

    • 将所有边按权重升序排序。

    • 依次选择边,若其连接两个不同连通分量(不形成环),则加入生成树。

    • 使用并查集(Union-Find)高效管理连通性。

  2. 时间复杂度:O(E log E)(排序和并查集操作)。

  3. 适用场景:稀疏图(边较少)。

普里姆算法(Prim)
  1. 步骤

    • 从任一顶点开始,逐步扩展。

    • 每次选择连接已选顶点集和未选顶点集的最小权重边。

    • 使用优先队列(如堆)维护候选边。

  2. 时间复杂度

    • 二叉堆:O(E log V)

    • 斐波那契堆:O(E + V log V)(更优)。

  3. 适用场景:稠密图(边较多)。

3.具体例子:

假设有一个无向图,包含 4个顶点(A, B, C, D) 和 6条边,权重如下:

  • AB: 权重 1

  • AC: 权重 3

  • AD: 权重 4

  • BC: 权重 2

  • BD: 权重 5

  • CD: 权重 6

目标:找到该图的最小生成树(总权重最小)。

1. 克鲁斯卡尔算法(Kruskal)示例

步骤
  1. 按权重升序排序所有边

AB(1) → BC(2) → AC(3) → AD(4) → BD(5) → CD(6)
  1. 初始化并查集:每个顶点自成一个集合。

  2. 依次选择边并检查是否形成环

    • 选择 AB(1):连接 A 和 B(不同集合),合并集合。
      已选边:AB(1)
      总权重:1
      顶点集合:{A, B}, {C}, {D}

    • 选择 BC(2):连接 B 和 C(不同集合),合并集合。
      已选边:AB(1), BC(2)
      总权重:1+2=3
      顶点集合:{A, B, C}, {D}

    • 选择 AC(3):A 和 C 已属于同一集合(形成环),跳过。

    • 选择 AD(4):连接 A 和 D(不同集合),合并集合。
      已选边:AB(1), BC(2), AD(4)
      总权重:1+2+4=7
      顶点集合:{A, B, C, D}(所有顶点连通)

    • 此时已选 3 条边(V-1=3),算法终止

最终最小生成树
A — B (1)
B — C (2)
A — D (4)

2. 普里姆算法(Prim)示例

步骤
  1. 从顶点 A 开始,初始化优先队列(最小堆)。

  2. 逐步扩展生成树

    • 初始状态:已访问顶点 {A},候选边为 A 的邻边 AB(1)、AC(3)、AD(4)。
      优先队列:AB(1), AC(3), AD(4)

    • 选择 AB(1):连接 A 和 B,标记 B 为已访问。
      已选边:AB(1)
      总权重:1
      候选边更新:添加 B 的邻边 BC(2)、BD(5)。
      优先队列:BC(2), AC(3), AD(4), BD(5)

    • 选择 BC(2):连接 B 和 C,标记 C 为已访问。
      已选边:AB(1), BC(2)
      总权重:1+2=3
      候选边更新:添加 C 的邻边 CD(6)。
      优先队列:AC(3), AD(4), BD(5), CD(6)

    • 选择 AC(3):A 和 C 已连通(C 已访问),跳过。

    • 选择 AD(4):连接 A 和 D,标记 D 为已访问。
      已选边:AB(1), BC(2), AD(4)
      总权重:1+2+4=7
      所有顶点已访问,算法终止

最终最小生成树
A — B (1)
B — C (2)
A — D (4)

关键结论

  • 克鲁斯卡尔:按边权重排序,逐步合并不连通的子树。

  • 普里姆:从起点扩展,每次选择连接已访问和未访问顶点的最小边。

  • 两种算法结果相同:因为示例图权重唯一,生成的最小生成树唯一。

http://www.lryc.cn/news/538165.html

相关文章:

  • C语言-章节 4:函数的定义与声明 ——「神秘法术的卷轴」
  • 《云原生安全攻防》-- K8s镜像安全:镜像全生命周期安全管理
  • uniapp商城之首页模块
  • 【Javascript Day13、14、15、16】
  • linux 板子的wifi模块连上路由器后,用udhcpc给板子wifi分配ip,udhcpc获取到ip,但没有写入wlan0网卡上
  • openGauss 3.0 数据库在线实训课程13: 学习逻辑结构:表管理1
  • 网络编程-
  • 基于单片机的常规肺活量SVC简单计算
  • 【PostgreSQL】PG在windows下的安装
  • 电动汽车电池监测平台系统设计(论文+源码+图纸)
  • 基于和声搜索(Harmony Search, HS)的多中心点选址优化算法matlab仿真
  • 单链表的概念,结构和优缺点
  • SpringBoot+数据可视化的奶茶点单购物平台(程序+论文+讲解+安装+调试+售后)
  • 深入理解 Vue3 中 ref 与 reactive 的区别及应用
  • TDengine 客户端连接工具 taos-Cli
  • Linux(ubuntu)下载ollama速度慢解决办法
  • Mac安装JD-GUI
  • Jenkins 配置 Git Parameter 四
  • 【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南
  • Python 自然语言处理(NLP)和文本挖掘的常规操作过程
  • 传统数组 vs vector和list
  • CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程
  • 【ESP32】ESP-IDF开发 | WiFi开发 | HTTPS服务器 + 搭建例程
  • Vue2 中使用 UniApp 时,生命周期钩子函数总结
  • 如何在 Vue 3 中使用 Vue Router 和 Vuex
  • Fiori APP配置中的Semantic object 小bug
  • 【触想智能】工业显示器和普通显示器的区别以及工业显示器的主要应用领域分析
  • BPMN.js 与 DeepSeek 集成:打造个性化 Web 培训项目的秘诀
  • 第二月:学习 NumPy、Pandas 和 Matplotlib 是数据分析和科学计算的基础
  • 安全测试|SSRF请求伪造