1.算法简述

kruskal是基于贪心思想被设计出来的。此算法得目的是从给定的无向图中获得一棵生成树,并且此生成树得权值之和最小。举个现实中的例子,图的每个顶点都是一个城市,每条边的权值表示两个城市之间的距离,那么现在要铺设铁路,使得每个没做城市都可以互相到达,并且花费的铁轨最少,这个问题就可以用kruskal算法求解。

常见的最小生成树的算法有kruskal和prim,此文章只叙述前者。

2.算法描述

初始时,我们的最小生成树为空,对于图G,我们从中找出权值最小的边,有了这条边后,如果把这条边和我们的最小生成树构成回路,那么不能把这条边放入最小生成树中,如果不会构成回路,那么就可以更新我们的最小生成树(把这条边和对应的一对顶点放进去)。重复以上操作,直到遍历完所有的边。

3.代码

在上面的算法描述中,我们需要判断当前的边是否会跟生成树构成回路,对于这个条件判断在使用代码实现时,我们这样转换:
如果这条边的两个顶点都在最小生成树中出现了,那么这条边一定会跟最小生成树构成回路,不能添加到最小生成树中。
所以我们使用数据结构Edge来记录每条边的起点,终点和权重,使用added数组来表示顶点是否被添加到最小生成树中。

vector<int> MGraph::Kruskal() {// 构造权值边表vector<Edge> min_weight_vec;for (int i = 0; i < vex_num; i++) {for (int j = i + 1; j < vex_num; j++) {if (edge[i][j] != INF) {min_weight_vec.emplace_back(Edge(i, j, edge[i][j]));}}}// 初始化并查集数组vector<int> v(vex_num, 0);for (int i = 0; i < vex_num; i++)v[i] = i;// 按权值递增排序sort(min_weight_vec.begin(), min_weight_vec.end());// 构成最小生成树的边的权值vector<int> res;int root_start = 0, root_end = 0;for (int i = 0; i < min_weight_vec.size(); i++) {root_start = getRoot(min_weight_vec[i].start, v);root_end = getRoot(min_weight_vec[i].end, v);if (root_start != root_end) {v[root_start] = root_end;res.push_back(min_weight_vec[i].weight);}}return res;
}

全部代码详见我的github仓库
里面有数据结构的全部代码

kruskal C++相关推荐

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

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

  2. 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)

    #include <iostream> using namespace std; //约定: //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, ...

  3. Kruskal算法 - C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树.  例如,对于如上图G4所示的连通网可以有多棵权值总 ...

  4. vijos P1190繁忙的都市(Kruskal)(最小生成树)

    P1190  繁忙的都市 城市C是一个非常繁忙的大都市,城市 中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉 ...

  5. 技术图文:如何利用C# 实现 Kruskal 最小生成树算法?

    背景 以前我写过一些图文来介绍有关数据结构与算法的知识: 8大排序算法之:直接插入排序(Straight Insertion Sort) 8大排序算法之:希尔插入排序(Shell Insertion ...

  6. 【数据结构】最小生成树 Prim算法 Kruskal算法

    最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...

  7. ds图—最小生成树_Java: Kruskal算法生成最小生成树(邻接矩阵)

    Java: Kruskal算法生成最小生成树(邻接矩阵): package 输出: Kruskal=36: (E,F) (C,D) (D,E) (B,F) (E,G) (A,B) 分析: Java: ...

  8. Kruskal算法模版

    1.例如:求解如图的最小生成树 求解过程: 方法一:一般做法(最终都是在避环) #include<iostream> #include<algorithm> #include& ...

  9. HDU2988(Kruskal算法模版)

    其实以下两种方法的实质本来就是一样的,就是在写的形式不一样而已!只要理解就可以了! 方法一: #include<iostream> #include<algorithm> #i ...

  10. 最小生成树(kruskal、prim、最小生成森林问题、严格次小生成树)

    整理的算法模板合集: ACM模板 目录 一.kruskal算法 二.prim算法 三.Boruvka算法 四.生成森林问题(K颗树) 五.最小生成树的唯一性 六.严格次小生成树 LCA优化的次小生成树 ...

最新文章

  1. 后疫情时代,RTC期待新的场景大爆发
  2. Java多线程面试题通关手册!
  3. 不是微型计算机主板上的部件,微型计算机主板上安装的主要部件
  4. java excel函数_JAVA实现EXCEL公式专题(四)——字符串函数
  5. java使用tar算法压缩解压缩文件、数据流、byte[]字节数组
  6. (转载)图文推荐给开发人员非常实用的站点
  7. Java面试题超详细讲解系列之四【Jvm篇】
  8. vue 中使用海康威视视频插件
  9. SAP检验批次批量取消程序示例(备份)
  10. 测试管理 | 龙智获得Xray专家认证
  11. selenium-对指定区域截图
  12. 用react-custom-scrollbars插件美化 滚动条
  13. 1156 十个成绩排序
  14. 阿里云服务器密码重置
  15. note4x rom android p,红米Note4x安卓8.0刷机包
  16. 数据集制作之xml文件转化为csv
  17. 关于阿里云业务数据分析
  18. 论文阅读|《面向多目标柔性作业车间调度的强化学习NSGA-Ⅱ算法》
  19. arcgis将直线等分_如何快速定数等分一条线段?
  20. 【Python3 笔记】《笨办法学Python》

热门文章

  1. 计算机上午指令系统是指,计算机指令系统是指( )。
  2. Paper reading
  3. 微信小程序云开发-云函数篇
  4. 2020-11-22 Vue-10组件化开发(1)
  5. 5个城市,5个女人,5种生活
  6. 2018 UESTC Training for Data Structures 小埋的steam愿望单
  7. Python入门(二十三)- 文件操作1
  8. 功放板加开关音量_一种带音量开关功能的音响功放板的制作方法
  9. Microsoft Azure Administrator AZ-104 AZ-103笔记/考点总结
  10. OpenMPI:介绍与an'zhuang