当前位置: 首页 > 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)

关键结论

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

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

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

相关文章:

  • FFmpeg源码:av_strlcpy函数分析
  • 探索 DeepSeek:AI 领域的璀璨新星
  • 深度学习实战道路裂缝缺陷识别
  • 计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程
  • PyTorch 源码学习:阅读经验 代码结构
  • Flink提交pyflink任务
  • pytest asyncio 支持插件 pytest-asyncio
  • 基于51单片机的的鸡笼补光和恒温系统的设计与实现(源程序+Protues仿真+电路图+元件清单+器件手册)
  • python opencv基础使用总结
  • 41.日常算法
  • 介绍两本学习智谱大模型的入门图书
  • Java小白入门基础知识(二)
  • 晶闸管主要参数分析与损耗计算
  • JavaScript 内置对象-日期对象
  • Ubuntu 系统 LVM 逻辑卷扩容教程
  • Hive之分区表
  • 【大模型系列】Windows系统上运行大语言模型方式
  • SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)
  • HCIA项目实践(网络)---NAT地址转化技术
  • frp-tool,客户端frp命令行工具
  • 78家公募年度业绩比拼:23家营收净利双升,十强座次微调
  • 解放日报:这是一场需要定力和实力的“科技长征”
  • 解放日报:持续拿出排头兵姿态先行者担当
  • 游客曝九寨沟打网约车被出租车围堵,官方:前者违规,后者做法不对
  • 新华保险一季度净赚58.82亿增19%,保费收入增28%
  • 中办、国办印发《安全生产考核巡查办法》