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

LeetCode Kruskal 算法题解

LeetCode Kruskal 算法题解

题目描述

Kruskal 算法是一种用于构建最小生成树的贪心算法。最小生成树是连通图中所有边的权值之和最小的生成树。

示例

对于以下加权图:

A --(2)-- B --(4)-- C | | | (1) (3) (1) | | | D --(5)-- E --(2)-- F

最小生成树的边包括:A-D (1), A-B (2), B-E (3), E-F (2), F-C (1),总权值为 1+2+3+2+1=9。

解题思路

方法:Kruskal 算法

思路

  • Kruskal 算法的核心思想是按照边的权值从小到大排序,然后依次选择边,如果这条边连接的两个顶点不在同一个连通分量中,则将其加入最小生成树。
  • 具体步骤:
    1. 将所有边按照权值从小到大排序。
    2. 初始化一个并查集,用于跟踪顶点的连通性。
    3. 依次遍历排序后的边,对于每条边:
      • 如果边的两个顶点不在同一个连通分量中,将这条边加入最小生成树,并合并这两个顶点的连通分量。
    4. 重复步骤 3,直到最小生成树包含 V-1 条边(其中 V 是顶点数)。

复杂度分析

  • 时间复杂度:O(E log E),其中 E 是边数。排序边的时间复杂度为 O(E log E),并查集的操作时间接近常数。
  • 空间复杂度:O(E + V),需要存储边和并查集的信息。

代码实现

方法:Kruskal 算法

# 并查集类 class UnionFind: def __init__(self, size): self.parent = list(range(size)) self.rank = [0] * size def find(self, x): if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) # 路径压缩 return self.parent[x] def union(self, x, y): x_root = self.find(x) y_root = self.find(y) if x_root == y_root: return False # 已经在同一个集合中 # 按秩合并 if self.rank[x_root] < self.rank[y_root]: self.parent[x_root] = y_root else: self.parent[y_root] = x_root if self.rank[x_root] == self.rank[y_root]: self.rank[x_root] += 1 return True # Kruskal 算法 def kruskal(edges, num_vertices): # 按照边的权值从小到大排序 edges.sort(key=lambda x: x[2]) uf = UnionFind(num_vertices) min_spanning_tree = [] total_weight = 0 for edge in edges: u, v, weight = edge if uf.union(u, v): min_spanning_tree.append(edge) total_weight += weight # 最小生成树包含 V-1 条边 if len(min_spanning_tree) == num_vertices - 1: break return min_spanning_tree, total_weight # 测试 def test_kruskal(): # 构建图的边列表(顶点用0-5表示:A=0, B=1, C=2, D=3, E=4, F=5) edges = [ (0, 1, 2), # A-B (2) (0, 3, 1), # A-D (1) (1, 2, 4), # B-C (4) (1, 4, 3), # B-E (3) (2, 5, 1), # C-F (1) (3, 4, 5), # D-E (5) (4, 5, 2), # E-F (2) ] num_vertices = 6 # 测试 Kruskal 算法 min_spanning_tree, total_weight = kruskal(edges, num_vertices) print("Minimum Spanning Tree edges:") for u, v, weight in min_spanning_tree: print(f"{chr(65+u)} - {chr(65+v)}: {weight}") print(f"Total weight: {total_weight}") # 输出: # Minimum Spanning Tree edges: # A - D: 1 # C - F: 1 # A - B: 2 # E - F: 2 # B - E: 3 # Total weight: 9 if __name__ == "__main__": test_kruskal()

测试用例

测试用例:最小生成树

输入:

A --(2)-- B --(4)-- C | | | (1) (3) (1) | | | D --(5)-- E --(2)-- F

输出:

Minimum Spanning Tree edges: A - D: 1 C - F: 1 A - B: 2 E - F: 2 B - E: 3 Total weight: 9

总结

Kruskal 算法是一种重要的图论算法,它可以用于构建最小生成树。通过贪心策略和并查集,Kruskal 算法可以高效地找到权值之和最小的生成树。

Kruskal 算法的核心思想是:按照边的权值从小到大排序,然后依次选择边,如果这条边连接的两个顶点不在同一个连通分量中,则将其加入最小生成树。

掌握 Kruskal 算法的原理和实现,对于理解和解决图论相关问题非常重要。

http://www.jsqmd.com/news/712939/

相关文章:

  • SOCD Cleaner:如何用开源工具解决游戏输入冲突,实现亚毫秒级响应
  • CnOpenData 税收调查企业实用新型专利授权质量统计表
  • 【避坑指南】Qwen2.5-VL-7B-Instruct RTX 4090版常见问题与解决方案
  • 【收藏备用】2026年金三银四春招|AI岗位暴涨12倍,程序员/小白靠大模型逆袭指南
  • 终极指南:5分钟学会用Python一键备份QQ空间所有历史说说
  • OraScan (Oracle碎片扫描工具)使用说明
  • Awesome LLM资源列表:从业者的高效学习与应用导航
  • 为什么 Claude Code 没有一句废话?扒光它的底层提示词,我悟了!
  • 目前工资最高的几家外包公司汇总!(2026 最新版)
  • 深入epoll封装:event_set与event_add核心原理剖析
  • WarcraftHelper:魔兽争霸III终极优化指南,解锁高帧率与宽屏适配
  • 医疗影像不平衡分类实战:乳腺X光微钙化检测
  • 遗传算法原理与Python实现详解
  • LeetCode Prim 算法题解
  • 螺蛳粉包装设计公司哪家专业靠谱 速食螺蛳粉品牌包装升级首选哲仕设计 - 设计调研者
  • 2026年行业内专业的正品云南一机直销厂家推荐,数控车床/数控斜车/普通车床/云南车床/云南一机,正品云南一机企业推荐 - 品牌推荐师
  • GLM-4.1V-9B-Base入门指南:视觉理解模型Fine-tuning入门路径
  • 解密baidupankey:如何用AI技术秒级获取百度网盘提取码
  • ZooBot:基于SQLite与多通道架构的本地AI多智能体协作平台实战
  • QMCDecode终极指南:3步解锁QQ音乐加密格式,实现音乐自由
  • GetQzonehistory:3步搞定QQ空间历史说说备份,永久保存你的青春回忆
  • 2026年毕业论文AIGC率飘红?实测5个去AI痕迹核心手段,附保姆级工具清单 - 降AI实验室
  • Zotero插件市场:3分钟搞定插件安装,彻底告别手动下载烦恼 [特殊字符]
  • 如何一键备份你的QQ空间历史说说?GetQzonehistory终极指南
  • NVIDIA Profile Inspector多语言支持实战指南:让显卡优化工具服务全球用户
  • Transformer注意力下沉现象解析与优化策略
  • LeetCode 拓扑排序题解
  • 2026年3月钢琴搬家公司选哪家,跨省搬家/低价搬家/空调移机搬家/企业搬家/长途搬家,钢琴搬家公司哪家便宜又好 - 品牌推荐师
  • 四月二十八早上
  • 进化策略算法:原理、实现与优化技巧