漫画:什么是最小生成树?

简介: 它的最小生成树是什么样子呢?下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小,去掉那些多余的边,该图的最小生成树如下。



640.jpg640.jpg

—————  第二天  —————



640.jpg640.jpg640.jpg640.jpg640.jpg640.jpg640.jpg

————————————


640.jpg640.jpg640.jpg640.jpg640.jpg640.jpg


首先看看第一个例子,有下面这样一个带权图:

640.png

它的最小生成树是什么样子呢?下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小:


640.png

去掉那些多余的边,该图的最小生成树如下:


640.png



下面我们再来看一个更加复杂的带权图:



640.png

同样道理,下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小:


640.png


去掉那些多余的边,该图的最小生成树如下:


640.png640.jpg640.jpg640.jpg



怎样铺设才能保证成本最低呢?



城市之间的交通网就像一个连通图,我们并不需要在每两个城市之间都直接进行连接,只需要一个最小生成树,保证所有的城市都有铁路可以触达即可。

640.png


image.gif

640.jpg640.jpg

Prim算法是如何工作的呢?



这个算法是以图的顶点为基础,从一个初始顶点开始,寻找触达其他顶点权值最小的边,并把该顶点加入到已触达顶点的集合中。当全部顶点都加入到集合时,算法的工作就完成了。Prim算法的本质,是基于贪心算法。

接下来说一说最小生成树的存储方式。我们最常见的树的存储方式,是链式存储,每一个节点包含若干孩子节点的指针,每一个孩子节点又包含更多孩子节点的指针:


image.gif

640.png

这样的存储结构很清晰,但是也相对麻烦。为了便于操作,我们的最小生成树用一维数组来表达,数组下标所对应的元素,代表该顶点在最小生成树当中的父亲节点。(根节点没有父亲节点,所以元素值是-1)

640.png

image.gif


下面让我们来看一看算法的详细过程:



1.选择初始顶点,加入到已触达顶点集合。

640.png

image.gif


2.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从0到2的边权值最小,把顶点2加入到已触达顶点集合,Parents当中,下标2对应的父节点是0。


640.pngimage.gif

3.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从2到4的边权值最小,把顶点4加入到已触达顶点集合,Parents当中,下标4对应的父节点是2。


image.gif

640.png

4.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从0到1的边权值最小,把顶点1加入到已触达顶点集合,Parents当中,下标1对应的父节点是0。


image.gif

640.png

5.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从1到3的边权值最小,把顶点3加入到已触达顶点集合,Parents当中,下标3对应的父节点是1。

image.gif

640.png

这样一来,所有顶点都加入到了已触达顶点集合,而最小生成树就存储在Parents数组当中。image.gif

image.gif640.jpg640.jpg


final
static
int
 INF 
=
Integer
.
MAX_VALUE
;
public
static
int
[]
 prim
(
int
[][]
 matrix
){
List
<
Integer
>
 reachedVertexList 
=
new
ArrayList
<
Integer
>();
//选择顶点0为初始顶点,放入已触达顶点集合中
    reachedVertexList
.
add
(
0
);
//创建最小生成树数组,首元素设为-1
int
[]
 parents 
=
new
int
[
matrix
.
length
];
    parents
[
0
]
=
-
1
;
//边的权重
int
 weight
;
//源顶点下标
int
 fromIndex 
=
0
;
//目标顶点下标
int
 toIndex 
=
0
;
while
(
reachedVertexList
.
size
()
<
 matrix
.
length
)
{
        weight 
=
 INF
;
//在已触达的顶点中,寻找到达新顶点的最短边
for
(
Integer
 vertexIndex 
:
 reachedVertexList
)
{
for
(
int
 i 
=
0
;
 i 
<
 matrix
.
length
;
 i
++)
{
if
(!
reachedVertexList
.
contains
(
i
))
{
if
(
matrix
[
vertexIndex
][
i
]
<
 weight
)
{
                        fromIndex 
=
 vertexIndex
;
                        toIndex 
=
 i
;
                        weight 
=
 matrix
[
vertexIndex
][
i
];
}
}
}
}
//确定了权值最小的目标顶点,放入已触达顶点集合
        reachedVertexList
.
add
(
toIndex
);
//放入最小生成树的数组
        parents
[
toIndex
]
=
 fromIndex
;
}
return
 parents
;
}
public
static
void
 main
(
String
[]
 args
)
{
int
[][]
 matrix 
=
new
int
[][]{
{
0
,
4
,
3
,
 INF
,
 INF
},
{
4
,
0
,
8
,
7
,
 INF
},
{
3
,
8
,
0
,
 INF
,
1
},
{
INF
,
7
,
 INF
,
0
,
9
},
{
INF
,
 INF
,
1
,
9
,
0
},
};
int
[]
 parents 
=
 prim
(
matrix
);
System
.
out
.
println
(
Arrays
.
toString
(
parents
));
}


这段代码当中,图的存储方式是邻接矩阵,在main函数中作为测试用例的图和对应的邻接矩阵如下:image.gif

640.jpg

当然,也可以使用邻接表来实现prim算法,有兴趣的小伙伴可以尝试写一下代码。640.jpg640.jpg

相关文章
|
17天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34817 44
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
11天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
10798 36
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
6天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
2260 22
|
29天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45715 156
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
11天前
|
机器学习/深度学习 存储 人工智能
还在手写Skill?hermes-agent 让 Agent 自己进化能力
Hermes-agent 是 GitHub 23k+ Star 的开源项目,突破传统 Agent 依赖人工编写Aegnt Skill 的瓶颈,首创“自我进化”机制:通过失败→反思→自动生成技能→持续优化的闭环,让 Agent 在实践中自主构建、更新技能库,持续自我改进。
1726 6
|
4天前
|
人工智能 弹性计算 安全
Hermes Agent是什么?怎么部署?超详细实操教程
Hermes Agent 是 Nous Research 于2026年2月开源的自进化AI智能体,支持跨会话持久记忆、自动提炼可复用技能、多平台接入与200+模型切换,真正实现“越用越懂你”。MIT协议,部署灵活,隐私可控。
1401 2

热门文章

最新文章

下一篇
开通oss服务