python 算法之 克鲁斯卡尔算法

文章目录

  • 原理
  • 代码实现

原理

克鲁斯卡尔(Kruskal)算法是一种用于求解最小生成树(Minimum Spanning Tree,MST)的贪心算法。最小生成树是一个连通加权无向图中生成树(即包含图中所有顶点并且是一棵树),其所有边的权值之和最小。

克鲁斯卡尔算法的基本思想是从图中所有边中选择权值最小的边,并且保证选择的边不构成环路,直到选取了 n-1 条边为止(n 是顶点的数量)。这样得到的就是最小生成树。

下面是克鲁斯卡尔算法的详细步骤:

  1. 将图中的所有边按照权值进行升序排序。
  2. 初始化一个空的最小生成树 MST。
  3. 依次遍历排序后的边,每次取出权值最小的边。
  4. 判断当前取出的边是否会形成环路。若不会形成环路,则将该边加入到最小生成树 MST 中。
  5. 重复步骤 4,直到最小生成树 MST 中包含了 n-1 条边,其中 n 是图的顶点数量。

代码实现

def kruskal(graph):# 将图中的边按权值排序graph = sorted((w, u, v) for u, nbrs in enumerate(graph) for v, w in nbrs)mst = []  # 存储最小生成树的边parent = list(range(len(graph)))  # 并查集初始化,每个节点的父节点是自己# 并查集的查找操作,找到根节点def find(u):if u != parent[u]:parent[u] = find(parent[u])return parent[u]# 遍历排序后的边for w, u, v in graph:pu, pv = find(u), find(v)if pu != pv:  # 如果两个顶点不在同一个连通分量中,即不会形成环路mst.append((u, v, w))  # 将该边加入最小生成树parent[pv] = pu  # 合并两个连通分量return mst# 示例输入
graph = [[(5, 1), (3, 2)],[(5, 0), (6, 2), (2, 3)],[(3, 0), (6, 1), (7, 3), (9, 4)],[(2, 1), (7, 2), (4, 4)],[(9, 2), (4, 3)]
]# 计算最小生成树
mst = kruskal(graph)
print("最小生成树:", mst)

介绍代码的功能和实现原理:

  1. kruskal() 函数接受一个图 graph 作为输入,并返回该图的最小生成树。
  2. 首先,将图中的边按照权值进行排序,这可以通过列表推导式来完成。每条边表示为元组 (w, u, v),其中 w 是边的权值,uv 是边所连接的两个顶点的索引。
  3. 初始化一个空列表 mst,用于存储最小生成树的边。
  4. 初始化一个列表 parent,其中的每个元素表示一个节点的父节点,最初都指向自己。这个列表将用于实现并查集。
  5. 定义了一个内部函数 find(u),用于查找节点 u 所在连通分量的根节点。这个函数使用路径压缩技术,可以快速找到根节点,并且在查找过程中将路径上的节点直接连接到根节点,以减少后续查找的时间。
  6. 遍历排序后的边,对每一条边 (w, u, v) 进行处理。
  7. 对于每条边,使用 find() 函数查找其两个顶点 uv 所在连通分量的根节点 pupv
  8. 如果 pupv 不相等,说明 uv 不在同一个连通分量中,加入这条边不会形成环路,因此将其加入最小生成树 mst 中,并将这两个连通分量合并。合并操作通过将 pv 的父节点指向 pu 来完成。
  9. 最后,返回最小生成树 mst

这就是代码的主要功能和实现原理。它使用了克鲁斯卡尔算法来寻找最小生成树,通过并查集来维护连通分量,确保在构建最小生成树的过程中不会形成环路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++预处理命令与宏定义

C的预处理命令用于在编译源代码之前进行一些处理。预处理器指令以井号&#xff08;#&#xff09;开头&#xff0c;常用于包含头文件、宏定义和条件编译等操作。以下是几个常见的C预处理命令&#xff1a; 包含文件 #include <iostream> // 包含标准库头文件 #include &…

Vuex使用

Vuex 一、概述 二、State 存放状态的 1、创建state const state {title: 我是一个标题,content: 今天的天气是好的,age: 2, };2、使用 直接在页面直接使用 //非模块化写法 <div>{{ $store.state.title }}</div> //模块化写法 <div>{{ $store.state.abo…

前端秘法基础式(HTML)(第二卷)

目录 一.表单标签 1.表单域 2.表单控件 2.1input标签 2.2label/select/textarea标签 2.3无语义标签 三.特殊字符 一.表单标签 用来完成与用户的交互,例如登录系统 1.表单域 <form>通过action属性,将用户填写的数据转交给服务器 2.表单控件 2.1input标签 type…

【30秒看懂大数据】数据中台

知幽科技是一家专注企业数字/智化&#xff0c;围绕数据价值应用的一站式数智化解决方案的咨询公司&#xff0c;也包括了为企业提供定制化数据培训&#xff0c;力求做企业最好的数智化决策伙伴。 点击上方「蓝字」关注我们 30秒看懂大数据专栏 让您在有限的碎片化时间&#xf…

六、Mybatis注解开发

1.MyBatis的常用注解 注解开发越来越流行&#xff0c; Mybatis也可以使用注解开发方式&#xff0c;这样就可以减少编写Mapper映射文件。Insert&#xff1a;实现新增Update&#xff1a;实现更新Delete&#xff1a;实现删除Select&#xff1a;实现查询Result&#xff1a;实现结果…

(09)Hive——CTE 公共表达式

目录 1.语法 2. 使用场景 select语句 chaining CTEs 链式 union语句 insert into 语句 create table as 语句 前言 Common Table Expressions&#xff08;CTE&#xff09;&#xff1a;公共表达式是一个临时的结果集&#xff0c;该结果集是从with子句中指定的查询派生而来…

DS:二叉树的顺序结构及堆的实现

创作不易&#xff0c;兄弟们给个三连&#xff01;&#xff01; 一、二叉树的顺序存储 顺序结构指的是利用数组来存储&#xff0c;一般只适用于表示完全二叉树&#xff0c;原因如上图&#xff0c;存储不完全二叉树会造成空间上的浪费&#xff0c;有的人又会问&#xff0c;为什么…

Docker之Oracle-XE版本安装

Docker之Oracle-XE版本安装 文章目录 Docker之Oracle-XE版本安装1. docker中安装Oracle11gR2-XE1. 拉取镜像2. Quick Start(快速开始)3. 快速安装案例1. 运行docker容器2. 创建用户与授权3. 导出备份数据 1. docker中安装Oracle11gR2-XE dockerhub参考地址: https://hub.docker…

linux 09 软件安装,YUM

下载软件时候&#xff0c;windows会从网上下载exe文件。 windows中的exe文件linux中的rpm文件 简介部分&#xff1a; 其中的认识RPM包&#xff1a; YUM&#xff08;软件包管理工具&#xff09; 01.YUM工具简介 02.使用YUM 第一 安装YUM 全新安装&#xff1a; 01.先pin…

linux系统zabbix监控配置钉钉告警

zabbix配置钉钉告警 配置钉钉告警环境准备配置钉钉脚本文件钉钉日志目录编写脚本浏览器配置钉钉告警中文消息告警模版为用户添加报警媒介添加监控项》添加触发器》 添加玩监控项和触发器后添加动作 配置钉钉告警 环境准备 创建钉钉内部群创建自定义机器人记录加签地址和webho…

Web安全研究(六)

文章目录 HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs文章结构Introjs obfuscationmethodologyExample HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs CCS 2019 CISPA 恶意软件领域&#xff0c;基于学习的系统已经非常流行&am…

DS:二叉树的链式结构及实现

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、前言 前期我们解释过二叉树的顺序结构&#xff08;堆&#xff09;为什么比较适用于完全二叉树&#xff0c;因为如果用数组来实现非完全二叉树&#xff0c;那么数组的中间部分就可能会存在大量的空间浪费。 …

Linux操作系统基础(十四):集群服务器搭建

文章目录 集群服务器搭建 一、新增Linux服务器 1、克隆虚拟机 2、修改虚拟机的硬件配置 3、修改虚拟机的网络配置 二、关闭防火墙 1、关闭firewalld 2、关闭SElinux 三、修改主机名 四、修改hosts映射 五、SSH免密登录 六、时钟同步 七、远程文件拷贝 1、从本机拷…

剑指offer——二进制中1的个数

目录 1. 题目描述2. 可能引起死循环的想法3. 改进后的代码4. 给面试官惊喜的代码 1. 题目描述 请实现一个函数&#xff0c;输入一个整数&#xff0c;输出该数二进制表示中1的个数。例如把9表示成二进制位1001&#xff0c;有2位是1&#xff0c;因此如果输入9&#xff0c;该函数输…

Selenium图表自动化开篇

目录 前言&#xff1a; 使用 Canvas 或者 SVG 渲染 选择哪种渲染器 代码触发 ECharts 中组件的行为 前言&#xff1a; 图表自动化一直以来是自动化测试中的痛点&#xff0c;也是难点&#xff0c;痛点在于目前越来越多公司开始构建自己的BI报表平台但是没有合适的自动化测试…

Shell 学习笔记(三)-shell变量

Shell 语言是一种动态类型和弱类型语言, 因此,在Shell中无需显示地声明变量, 且变量的类型会根据不同的操作符而发生变化. 静态类型语言: 在程序编译期间就确定变量类型的语言, 如java, C等 动态类型语言: 在程序运行期间才确定变量类型的语言, 如PHP, Python等. 一 shell变量…

设计模式--策略模式(Strategy Pattern)

策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互相替换&#xff0c;让算法独立于使用它的客户端。 策略模式主要包含以下几个角色&#xff1a; Strategy&a…

高中信息技术—数据采集与编码(一)

计算机技术的应用&#xff0c;使得数据的处理方式发生了巨大的转变&#xff0c;要用计算机处理这些数据&#xff0c;需要对采集到的数据进行一定的转换。 采集方式 1.人工采集—观察、实验 2.机器采集 互联网—网络爬虫 传感器—自然信源 数字化 信息可用模拟信号或数字信号表…

re:从0开始的CSS之旅 13. 文档流

1. 三种基本机制 CSS盒子三种基本定位机制&#xff1a;普通流normal flow、浮动float、定位position 文档流&#xff08;标准流、普通流 normal flow&#xff09;&#xff1a;HTML文档中一些皆为盒子&#xff0c;而盒子在HTML文档中默认的显示标准&#xff0c;称为文档流 2. …

MySQL学习记录——구 复合查询

文章目录 1、基本查询2、多表查询3、自连接4、子查询1、多行子查询2、多列子查询3、from句中的子查询 5、合并查询 1、基本查询 看一些例子&#xff0c;不关心具体内容&#xff0c;只看写法 //查询工资高于500或岗位为MANAGER的雇员, 同时还要满足他们的姓名首字母为大写的J …