文章作者:ktyanny
文章来源:ktyanny
转载请注明,谢谢合作。
话说ktyanny昨天逃了一天的课,恶补并查集知识,就是为了写出经典得不得了的Kruscal最小生成树。今天早上9点钟爬起来,继续看了下Kruscal算法,顿然茅塞顿开了,哈哈
1、生成树的概念
连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树。
生成树是连通图的极小连通子图。所谓极小是指:若在树中任意增加一条边,则将出现一个回路;若去掉一条边,将会使之变成非连通图。 生成树各边的权值总和称为生成树的权。权最小的生成树称为最小生成树。
2、最小生成树的性质
用哲学的观点来说,每个事物都有自己特有的性质,那么图的最小生成树也是不例外的。按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点、n-1 条边。
3、构造最小生成树,要解决以下两个问题:
1.尽可能选取权值小的边,但不能构成回路(也就是环)。
2.选取n-1条恰当的边以连接网的 n个顶点。
4、
最小生成树Kruscal算法:
用ktyanny的口头陈述为,Kruscal算法实质是非朴素的贪心策略。初始状态,图的每个节点单独作为一个集合,图的边就绪状态为非降序排列。然后一次遍历图中的所有边(u, v),使用并查集的思想
(不懂并查集的
点击此处 并查集(不相交集合)
进行学习
)
,
find_set(u)
如果不等于find_set(v),也就是u和v不在同一个集合中,那么相当于判断了添加了边(u,
v)不会照成环。好!接下来的工作就是把需要的信息保存起来(比如边的信息之类的),同时合并u和v(使用union_set(u,
v)).当所有的顶点都添加到集合中去了,好!算法完毕。
5、Kruscal算法举例演示
假设部分:图中有9个顶点依次为a、b、c、d、e、f、g、h、i,各条边的权值直接看下面的图吧。
大概的过程看下面的步骤:下面给出的图很囧……(是因为我相机还不够高级,等挣钱了买个漂亮的),不过没关系,主要自己看的明白就好了。
看清楚了,箭头指向的是要处理的边,粗线边表示为被接纳的边了。
好了,在这里还是要夸一下《算法导论》这本书。
6、核心部分的代码
贴上比较好点的代码吧:
<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
const
int
MAX
=
100
;
/*
图的顶点个数最大上限
*/
typedef
struct
{
int
x, y;
int
w;
}edge;
edge e[MAX];
/*
上面描述为图的数据结构
*/
/*
下面部分为主要部分,根据你的程序的需要惊醒添加吧
*/
/*
MST_Kruscal算法的实现过程
*/
/*
将边排序
*/
qsort(e, n,
sizeof
(edge), cmp);
sum
=
0
;
for
(i
=
0
; i
<
n; i
++
)
{
x
=
find_set(e[i].x);
y
=
find_set(e[i].y);
if
(x
!=
y)
{
union_set(x, y, e[i].w);
}
}
7、算法分析
用Kruskal算法构造最小生成树的时间复杂度为O(eloge),与网中边的数目e有关,因此,它适用于求稀疏图的最小生成树。
我们还有一种思想比较复杂点的算法,prim算法,详情可以参考:最小生成树 普莱姆(prim)算法
8、相关练习
HDU 1301 Jungle Roads (Kruscal 最小生成树)
分享到:
相关推荐
图论模板 最小生成树,Kruscal算法,采用了并查集技术,外加注释,很通俗易懂的,可以用来解决acm 畅通工程方面的问题
用Kruscal算法求出最小生成树,该程序经测试~
在实际应用中,如设计网络、优化交通路线等,最小生成树算法有着广泛的应用。本文将详细讨论两种经典算法:Kruskal's Algorithm(克鲁斯卡尔算法)和Prim's Algorithm(普里姆算法),并结合提供的C++代码进行解析。...
### 最小生成树与Prim算法(邻接矩阵实现) #### 一、最小生成树概念 在图论中,一个无向图的生成树是该图的一个无环子图,且包含图中的所有顶点。若该图是有权图,则生成树上的边也带有相应的权重。最小生成树...
### 最小生成树问题的Kruskal算法的一种实现方法 #### 摘要与背景介绍 本文探讨了一种用于带权连通图的可行存储结构——单链表,并在此基础上研究了构造最小生成树(Minimum Spanning Tree, MST)的算法。最小生成...
实现了kruskal的算法,测试可行。
在这个程序中,它实现了两种经典的最小生成树算法:Prim算法和Kruskal算法。 1. **Prim算法** 是一种贪心策略,它从图中任意一个顶点开始,每次添加一条与当前生成树连接且权重最小的边。这个过程持续到所有顶点都...
自己写的最小生成树算法,请自己在同一个目录下建立一个gtest。txt的文件。 然后编译,这是在linux下写的,应该移植没有问题 C语言写的
最小生成树prim算法与克鲁斯算法实现,通过图的遍历和生成树求解实现(邻接矩阵、邻接表 —图的深度广度遍历算法的实现和最小生成树PRIM和KRUSCAL算法的实现)
这个算法在很大程度上灵活应用了Kruscal算法,同时也对其中的一些部分进行了优化,可以说是较好的算法。
最小生成树算法是图论中的一个经典问题,用于寻找连接所有顶点的边最少的树结构,这在很多实际场景中都有应用,如构建通信网络、优化交通路线等。在这个压缩包中,包含了两种最常用的最小生成树算法的实现:Prim算法...
本篇文章将对图的邻接矩阵、邻接表、深度优先遍历、广度优先遍历、最小生成树PRIM算法、最小生成树KRUSCAL算法、连通分量等知识点进行详细的介绍和分析。 1. 图的邻接矩阵 图的邻接矩阵是一种常用的图表示方法,它...
Kruskal算法是一种用于解决图论中的最小生成树问题的经典算法,由约瑟夫·克拉克·克鲁斯卡尔在1956年提出。它通过贪心策略选择边,始终选择当前未加入树的边中权值最小的一条,并确保这条边不会形成环路。以下是对...
最小生成树是图论中的一个经典问题,主要应用于网络设计、数据通信等领域,旨在找到连接所有顶点的边集合,使得这些边的总权重最小。在这个C++实现中,我们将会探讨两种常用的算法:Prim算法和Kruskal算法。 ### ...
Prim算法和Kruskal算法是两种常用求解最小生成树的算法。 1. **Prim算法**: Prim算法是从一个顶点开始,逐步扩展生成树,每次添加一条与当前生成树相连且权值最小的边。它以贪心策略为基础,确保每一步都选择...
在给出的代码中,最小生成树的实现采用了克鲁斯卡尔(Kruskal)算法。克鲁斯卡尔算法的基本思想是按边的权重从小到大排序,然后依次选择未形成环的边加入到当前的生成树中。为了避免在添加边时形成环,我们需要用到...
Prim 和 Kruscal 算法都是图论中常用的最短路径选择算法,它们可以用于解决加权图中的最小生成树问题。 Prim 算法使用贪婪策略,逐步添加新的顶点和边,使得生成树的权值最小,而 Kruscal 算法则是将图中的所有边...
Kruskal算法是一种用于解决图论中的最小生成树问题的经典算法。在图中,最小生成树是指连接所有顶点的树形子集,其边的权重之和最小。这个算法由Joseph Kruskal在1956年提出,主要用于网络设计、资源分配等领域。 ...
很久以前就学过最小生成树之Kruskal和Prim算法,这两个算法很容易理解,但实现起来并不那么容易。最近学习了并查集算法,得知并查集可以用于实现上述两个算法后,我自己动手实现了最小生成树算法。 宏观上讲,...
**Kruskal 算法详解** ...总结,Kruskal 算法是求解无向图最小生成树的经典方法,通过边的排序和并查集操作避免形成环,构建最优的树形结构。尽管在稠密图中可能效率稍低,但在许多实际问题中,它的表现依然非常出色。