Kruskal 算法介绍

news/2024/11/20 7:04:05/

一 点睛

构造最小生成树还有一种算法,即 Kruskal 算法:设图 G=(V,E)是无向连通带权图,V={1,2,...n};设最小生成树 T=(V,TE),该树的初始状态只有 n 个节点而无边的非连通图T=(V,{}),Kruskal 算法将这n 个节点看成 n 个孤立的连通分支。它首先将所有边都按权值从小到大排序,然后值要在 T 中选的边数不到 n-1,就做这样贪心选择:在边集 E 中选择权值最小的边(i,j),如果将边(i,j)加入集合 TE 中不产生回路,则将边(i,j)加入边集 TE 中,即用边(i,j)将这两个分支合并成一个连通分支;否则继续选择下一条最短边。把边(i,j)从集合 E 中删去,继续上面的贪心选择,直到 T 中的所有节点都在同一个连通分支上为止。此时,选取的 n-1 条边恰好构成图 G 的一棵最小生成树 T。

Kruskal 算法用一种非常聪明的方法,就是运用集合避圈;如果所选择加入边的起点和终点都在 T 集合中,就可以断定会形成回路,变的两个节点不能属于同一个集合。

二 算法步骤

1 初始化。将所有边都按权值从小到大排序,将每个节点集合号都初始化为自身编号。

2 按排序后的顺序选择权值最小的边(u,v)。

3 如果节点 u 和 v 属于两个不同的连通分支,则将边(u,v)加入边集 TE 中,并将两个连通分支合并。

4 如果选取的边数小于 n-1,则转向步骤2,否则算法结束。

三 图解

设图 G=(V,E)是无向连通带权图。

1 初始化

将所有边都按权值从小到大排序,如下图所示。将每个节点都初始化为一个孤立的分支,即一个节点对应一个集合,集合号为该节点的序号,如下图所示。

2 找最小

在 E 中寻找权值最小的边e1(2,7),边值为1.

3 合并

节点2 和节点7的集合号不同,即属于两个不同的连通分支,将边(2,7)加入边集 TE 中,执行合并操作,将两个连通分支的所有节点都合并为一个集合;假设把小的集合号赋值给大的集合号,那么节点7的集合号将改为2.如下图所示。

4 找最小

在 E 中寻找权值最小的边e2(4,5),边值为3.

5 合并

节点4 和节点5的集合号不同,即属于两个不同的连通分支,将边(4,5)加入边集 TE 中,执行合并操作,将两个连通分支的所有节点都合并为一个集合;将节点 5 的集合号将改为4.如下图所示。

6 找最小

在 E 中寻找权值最小的边e3(3,7),边值为4.

7 合并

节点3 和节点7的集合号不同,即属于两个不同的连通分支,将边(3,7)加入边集 TE 中,执行合并操作,将两个连通分支的所有节点都合并为一个集合;将节点 3 的集合号将改为2.如下图所示。

8 找最小

在 E 中寻找权值最小的边e4(4,7),边值为9.

9 合并

节点4 和节点7的集合号不同,即属于两个不同的连通分支,将边(4,7)加入边集 TE 中,执行合并操作,将两个连通分支的所有节点都合并为一个集合;将节点 4、5 的集合号将改为2.如下图所示。

10 找最小

在 E 中寻找权值最小的边e5(3,4),边值为15.

11 合并

节点3 和节点4的集合号相同,属于相同的连通分支,不能选择,否则会形成回路。

12 找最小

在 E 中寻找权值最小的边e6(5,7),边值为16.

13 合并

节点5 和节点7的集合号相同,属于相同的连通分支,不能选择,否则会形成回路。

14 找最小

在 E 中寻找权值最小的边e7(5,6),边值为17.

15 合并

节点 5 和节点 6 的集合号不同,即属于两个不同的连通分支,将边(5,6)加入边集 TE 中,执行合并操作,将两个连通分支的所有节点都合并为一个集合;将节点 6 的集合号将改为2.如下图所示。

16 找最小

在 E 中寻找权值最小的边e8(2,3),边值为20.

17 合并

节点2 和节点3的集合号相同,属于相同的连通分支,不能选择,否则会形成回路。

18 找最小

在 E 中寻找权值最小的边e9(1,2),边值为23.

19 合并

节点 1 和节点 2 的集合号不同,即属于两个不同的连通分支,将边(1,2)加入边集 TE 中,执行合并操作,将两个连通分支的所有节点都合并为一个集合;将节点 2,3,4,5,6,7 的集合号将改为1.如下图所示。

20 选中的各边和各个节点就是最小生成树,各边权值之和就是最小生成树的代价。


http://www.ppmy.cn/news/404457.html

相关文章

GitKraKen——安装及基本使用

GitKraKen 一、安装并破解 GitKraKen是收费工具,有能力的朋友请支持正版 1.下载最新版 2.将系统中release.gitkraken.com api.gitkraken域名屏蔽掉 这个目的是为了防止更新gitkraken,若不屏蔽掉这个域名,那么每次打开GitKraken是默认去检…

安卓实战开发之——使用 WIFI 进行设备搜索并获取相应信息

目录 一、前言 二、准备条件 三、功能要求 四、显示效果 五、关键代码 一、前言 此玩意是本人很早很早(记不清有多早了,反正很早)做过的一个课程任务了,无意之中翻到了,所以把它放上来。不愿再找以前写的代码了…

scroll 元素滚动到指定位置(包含app和网页)

使用VueScrollTo实现网页平滑滚动效果 VueScrollTo是一个基于Vue的平滑滚动插件,实现网页中元素点击后平滑滚动到目标位置的效果。在很多情况下,我们需要在网页中使用锚点链接,但是默认的锚点跳转方式可能会出现跳动或者瞬间跳转的情况&…

创新指南 | 推动销售的17个可落地的集客式营销示例

无论您是开启集客式的营销有一段时间还是处于起步阶段,了解像您这样的企业是如何粉碎竞争对手的的集客式策略总是有帮助的。无论您的公司做什么,它所服务的行业,是B2B还是B2C ,您都可以在这里找到许多可以使用的示例。 在本文中&…

4.java转义符,javadoc 标签

java常用转义字符 在控制台,输入tab键,可以实现命令补全 (如何解决cmd中Tab键不能自动补充的问题?百度一下) \t : 一个制表符,实现对齐功能\n : 换行符\ \ : 一个\\ " :一个"\ ’ : 一个’\r : 一个回车 …

GIT统计代码量

GIT统计代码量 Git统计个人提交代码行数 git log --format%aN | sort -u | while read name; do echo -en "$name\t"; git log --author"$name" --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %…

win7win10 C盘根目录无法写入权限的方法

方法如下: 1. 选中C盘 2. 点右键选中属性(properties) 3. 选“安全”(Security) Tab 4. Users 5. “编辑”(Edit) 6. Full Control 7. Apply 8 OK 此方法试了无效,可能跟安装了c…

CMD进入c盘根目录的方法

使用cd..命令返回上一层目录即可