1. 算法步骤

Kruskal 算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。

1. 把图中的所有边按代价从小到大排序;

2. 把图中的n个顶点看成独立的n棵树组成的森林;

3. 按权值从小到大选择边,所选的边连接的两个顶点Ui和Vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。重复此操作,直到所有顶点都在一颗树内或者有n-1条边为止。

2. 算法实例

以下是一个无向图和按权值从小到大排列的边集数组。

以下是算法实现

#include <stdio.h>
#include <string.h>
#include <algorithm>
// 顶点个数的最大值
#define MAXN 11
// 边的个数的最大值
#define MAXM 20
using namespace std;
// 边
struct edge {// 边的顶点、权值int u, v, w;
// 边的数组
} edges[MAXM];  // parent[i]为顶点 i 所在集合对应的树中的根结点
int parent[MAXN];
// 顶点个数、边的个数
int n, m;
// 循环变量
int i, j; // 初始化
void UFset(){for (i = 1; i <= n; i++){parent[i] = -1;}
}
// 查找并返回节点 x 所属集合的根结点
int Find(int x){// 查找位置int s; for (s = x; parent[s] >= 0; s = parent[s]);// 优化方案 ―― 压缩路径,使后续的查找操作加速while (s != x) {int tmp = parent[x];parent[x] = s;x = tmp;}return s;
}// 将两个不同集合的元素进行合并,使两个集合中任两个元素都连通
void Union(int R1, int R2){// r1 为 R1 的根结点,r2 为 R2 的根结点int r1 = Find(R1), r2 = Find(R2);  // 两个集合结点个数之和(负数)int tmp = parent[r1] + parent[r2]; // 如果 R2 所在树结点个数 > R1 所在树结点个数(注意 parent[r1]是负数)// 优化方案 ―― 加权法则if (parent[r1] > parent[r2]){parent[r1] = r2;parent[r2] = tmp;}else{parent[r2] = r1;parent[r1] = tmp;}
}
// 实现从小到大排序的比较函数
bool cmp(edge a, edge b){return a.w <= b.w;
}void Kruskal(){// 生成树的权值int weight = 0; // 已选用的边的数目int num = 0; // 选用边的两个顶点     int u, v; // 初始化 parent[]数组         UFset();           for (i = 0; i < m; i++){u = edges[i].u;v = edges[i].v;if (Find(u) != Find(v)){printf("%d %d %d\n", u, v, edges[i].w);weight += edges[i].w;num++;Union(u, v);};if (num >= n - 1){break;}};printf("weight of MST is %d\n", weight);
}
int main(){// 边的起点和终点及权值int u, v, w;   // 读入顶点个数 n        scanf("%d%d", &n, &m); for (int i = 0; i < m; i++){// 读入边的起点和终点scanf("%d%d%d", &u, &v, &w); edges[i].u = u;edges[i].v = v;edges[i].w = w;}sort(edges, edges + m, cmp);Kruskal();return 0;
}

克鲁斯卡尔算法采用快排则时间复杂度为O(N log N)

对比普里姆和克鲁斯卡尔算法,普里姆算法对于稠密图,即边数非常多的情况下更好一些;而克鲁斯卡尔算法主要针对边来展开,边数少时效率比较高,所以对于稀疏图有较大的优势。

数据结构与算法-最小生成树之克鲁斯卡尔(Kruskal)算法相关推荐

  1. 算法:通过克鲁斯卡尔(Kruskal)算法,求出图的最小生成树

    之前我给大家分享过用普利姆(Prim)算法来求出图的最小生成树(点我去看看),今天我再给大家分享一个也是求图的最小生成树的克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,就相当于先 ...

  2. 普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法

    普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法 普里姆算法的基本思想: 取图中任意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w.添加顶点w的条件为:w 和已在生成树上的顶点v ...

  3. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  4. 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

    对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

  5. 【数据结构与算法】克鲁斯卡尔(Kruskal)算法

    一,应用场景 公交站问题 1)某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通 2)各个站点的距离用边线表示(权),比如 A - B距离12公里 3)问:如何修路保证各个站 ...

  6. 【算法】克鲁斯卡尔 (Kruskal) 算法

    目录 1.概述 2.代码实现 2.1.并查集 2.2.邻接矩阵存储图 2.3.邻接表存储图 2.4.测试代码 3.应用 本文参考: <数据结构教程>第 5 版 李春葆 主编 1.概述 (1 ...

  7. 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法

    图是一种基础又重要的数据结构,图的生成树是图的一个极小连通子图.最小生成树是无向连通网的所有生成树中边的权值之和最小的一棵生成树.求图的最小生成树可以牵引出很多经典的题目,例如在N个城市之间建立通讯网 ...

  8. 算法之克鲁斯卡尔(Kruskal)算法

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

  9. Java实现之克鲁斯卡尔(Kruskal)算法

    一.问题引入 1.问题引入 1)某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通 2)各个站点的距离用边线表示(权),比如A-B距离12公里 3)问:如何修路保证各个站点都 ...

  10. 克鲁斯卡尔算法c语言,最小生成树-克鲁斯卡尔(Kruskal)算法

    1. 克鲁斯卡尔算法简介 克鲁斯卡尔算法是一种用来寻找最小生成树的算法(用来求加权连通图的最小生成树的算法).在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边. 而具体 ...

最新文章

  1. php正则截取富文本编辑器中路径字符串_php使用正则表达式获取字符串中的URL
  2. 2020年python工资一般多少钱-2020年Python的就业薪资有多少?前景如何?
  3. Python学习手册(套装上下册)(原书第5版)
  4. matlab读取格式重复,matlab - 为什么Xlsread以字符串形式读取(日期时间) - 堆栈内存溢出...
  5. (转)快速统计二进制中1的个数
  6. [机器学习] 数据特征 标准化和归一化
  7. 工作80:块级元素的间隙问题
  8. Extract Subclass(提炼子类)
  9. 2021年的Angular最佳实践
  10. jQuery再学习之二、jQuery选择器
  11. js实现textarea滚动条位置始终在最下方
  12. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day1-Java入门
  13. 10 05 05 繁杂
  14. 自定义身份证输入键盘
  15. MySQL是怎样运行的
  16. 三国志9攻略如何打外族
  17. 卷积神经网络相比循环神经网络具有哪些特征
  18. HEVC中变换(Transform)过程中的scaling操作的理解
  19. ASP .NET MVC项目研发总结
  20. 机器学习-KNN最近邻算法原理及实践

热门文章

  1. Func:统一网络控制器
  2. html中按钮下拉菜单,Bootstrap3.0学习笔记之按钮与下拉菜单
  3. 前后端分离/前端模块化/传统页面和单页面
  4. SwiftUI iOS 精品完成项目之宠物展示与领养App MVVM(教程含源码)
  5. Java 运算符中 前++ 和后++ 的区别详解
  6. 01 Html基础知识
  7. 企业邮件网关首选:TurboGate反垃圾邮件网关
  8. 世界上应用最广泛的算法之一的卡尔曼滤波算法原理-从放弃到精通-无人机/机器人应用
  9. multisim二极管_变容二极管应用的Multisim仿真及分析
  10. spring框架学习 - 使用 Spring 的面向切面编程补充