算法的概念

  与Prim算法从顶点开始扩展最小生成树不同,Kruskal算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。假设N=(V,E)是连通网,对应的最小生成树T=(Vt,Et),Kruskal算法的步骤如下:

  初始化:Vt=V,Et=空集。即每个顶点构成一棵独立的树,T此时是一个仅含|V|个顶点的森林;

  循环(重复下列操作至T是一棵树):按G的边的权值第怎顺序依次从E-Et中选择一条鞭,如果这条边加入T后不构成回路,则将其加入Et,否则舍弃,直到Et中含有n-1条边。

实例及解析



第一步:



从上面介绍的步骤可以看出,按权值递增的顺序添加边,从这个例子中可以看出1是最短的边,加入集合E

第二步:



还是上面的原则,加入一条权值最短的边,并且不能构成回路,所以添加V4,V6的边。

第三步:



还是上面的原则,加入一条权值最短的边,并且不能构成回路,所以添加V2,V5的這条边。

第四步:



还是上面的原则,加入一条权值最短的边,并且不能构成回路,所以添加V3,V6的這条边。

第五步:



这一步很重要!我们会发现图中有3条权值为5的边,那我们应该如何选择呢?有一个很重要的原则就是添加这条边之后,生成树不能构成回路,如果添加V3,V4或者V1,V4这两条边的话就会构成回路,所以我们只能选择V2到V3的这条边;此时,最小生成树已经形成。

总结:通过kruskal算法和prim算法的比较我们可以发现一个最大的区别:Prim算法要求每次添加一条边,都要集合中所有的顶点都是连通状态的,而kruskal算法却没有这样的要求,它只需要每条边的权值都是从小往大递增选择的;而两个算法共同点就是要求:加入这条边之后,顶点集合不能构成一个回路。

伪代码

void Kruskal(V,T){
T=V;
numS=n;
while(numS>1){
从E中取出权值最小的边(v,u);
if(v和u属于T中不同的连通分量){
T=T∪{(v,u)};//将此边加入生成树中
numS--;//不连通分量树减1
}
}
}

算法复杂度

  通常在kruskal算法中,采用堆来存放边的集合,则每次选择最小权值的边只需要O(log|E|)的时间。(按小根堆存放,每次从堆顶取值,每次调整堆只需要logn的复杂度)。由于按照最小堆存放,所以建堆的时间为O(n),需要进行n-1次向下调整的操作,每次调整时间为O(logn),所以总的时间复杂度为O(nlogn),也就是O(ElogE)。

[数据结构]克鲁斯卡尔(Kruskal)算法的更多相关文章

  1. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  2. 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题

    链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...

  3. 图解最小生成树 - 克鲁斯卡尔(Kruskal)算法

    我们在前面讲过的<克里姆算法>是以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的.同样的思路,我们也可以直接就以边为目标去构建,因为权值为边上,直接找最小权值的边来构建生成树 ...

  4. 克鲁斯卡尔(Kruskal)算法

    # include <stdio.h> # define MAX_VERTEXES //最大顶点数 # define MAXEDGE //边集数组最大值 # define INFINITY ...

  5. 克鲁斯卡尔(Kruskal)算法求最小生成树

    /* *Kruskal算法求MST */ #include <iostream> #include <cstdio> #include <cstring> #inc ...

  6. 数据结构之最小生成树Kruskal算法

    1. 克鲁斯卡算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个 ...

  7. 最小生成树——Kruskal(克鲁斯卡尔)算法

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 Kruskal(克鲁斯卡尔)算法 的idea 并用 源代码加以实现: 0.2)最小生成树的基础知识,参见 ...

  8. 经典问题----最小生成树(kruskal克鲁斯卡尔贪心算法)

    题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...

  9. 最小生成树之克鲁斯卡尔(kruskal)算法

    #include <iostream> #include <string> using namespace std; typedef struct MGraph{ string ...

随机推荐

  1. shell实践

    shell实践 父子shell 父shell:我们在登录某个虚拟机控制器终端的时候(连接某一个linux虚拟机)时,默认启动的交互式shell,然后等待命令输入. ps命令参数,是否有横杠的参数作用是 ...

  2. JS学习笔记 (三) 对象进阶

    1.JS对象 1.1 JS对象特征 1.JS对象是基本数据数据类型之一,是一种复合值,可以看成若干属性的集合. 属性是名值对的形式(key:value) 属性名是字符串,因此可以把对象看成是字符串到值 ...

  3. 😊SpringBoot 整合 Elasticsearch (超详细).md

    SpringBoot 整合 Elasticsearch (超详细) 注意: 1.环境搭建 安装es Elasticsearch 6.4.3 下载链接 为了方便,环境使用Windows 配置 解压后配置 ...

  4. java学习之socket编程

    0x00前言和思维导图 Socks实际上是什么:实际上是提供了精彩通信的端口,在通信之前双方都必须要创造一个端点才能通信,其实感觉socket跟计算机的三次握手有些相似,分为三个步骤: (1)服务器监 ...

  5. Debian Linux 的安装

    Debian Linux 的安装 作者:Grey 原文地址: 博客园:Debian Linux 的安装 CSDN:Debian Linux 的安装 说明 本安装说明是基于 Windows 10 下 V ...

  6. centos8安装vsftpd

    注:ftp只能走相对路径传输文件,需要先cd到文件路径,然后ftp登陆,put上传,get下载 1. 装包与卸载 yum -y install vsftpd yum -y autoremove vsf ...

  7. 再见CMS

    观察网站最下方,根据备案号搜到这是个齐博CMS,然后百度就可以搜到齐博CMS漏洞了 然后开始利用 首先尝试了在用户信息修改处进行注入,发现好像想不通了,就在博客界面进行注入 Payload: 获取版本 ...

  8. Python3 Scrapy 框架学习

    1.安装scrapy 框架 windows 打开cmd输入 pip install Scrapy 2.新建一个项目: 比如这里我新建的项目名为first scrapy startproject fir ...

  9. 英格索兰扳手网口通信协议EOR原理

    前言 前几天遇到这个需求,需要记录扳手每一次的周期数据,但是我不知道通信协议是什么,只知道是一个tcp的连接,问售后,也不给我网口调试软件(英格索兰自己家的软件).经过我俩天的谷歌,终于找到了他们公司 ...

  10. windows 使用ACR122U-A9设备读写M1卡

    软件地址 M1卡服务程序 安装好驱动后就可以破解,破解成功后的秘钥会显示出来(记录下来),同级目录会生成一个dump文件,这个文件包含此M1卡的全部数据,可以使用hexedit打开,编辑或修改 Mif ...