以边为目标去构建最小生成树的算法就是Kruskal算法。
直接去找最小权值的边去构建生成树是很自然的想法,只不过构建时要考虑是否会形成环路而已。

共有15条边,将它们按权值升序排列。
接下来就是遍历按顺序每一条边;
对于某一条边是否该被纳入最小生成树的判定如下(涉及到并查集算法):
判断这条边的两个顶点G.edge[i].beginG.edge[i].end是否在同一个集合中;若顶点G.edge[i].begin和顶点G.edge[i].end不在同一个集合,即说明该边(G.edge[i].begin–>G.edge[i].end)没有与现有的生成树形成环路,可以把该边纳入现有的生成树;否则说明该边与现有的生成树会形成环路,所以不能把该边纳入现有的生成树。
所以问题归结到两点上:
1.如何判断某一条边的两个顶点是否在同一个集合中?
答:并查集算法,利用Find函数找出每个顶点所在集合的根结点。若根结点相同,则说明这两个顶点在同一个集合中;若根结点不同,这说明这两个顶点属于两个不同的集合。
2.如果某一条边的两个顶点属于两个不同的集合,可以纳入现有的生成树,那么该如何纳入?
答:把两个集合合并为一个集合:即先找出每个顶点所在集合的根结点,然后把两个根结点之间建立上下级关系(这里谁是上级谁是下级无所谓,优化算法不在这里讨论)。

接下来用图解法画出我的理解:
首先定义parent[e_root] = b_root;表示b_root是e_root的上级(这就是两个集合的合并,b_root和e_root分别是两个集合的根结点)。

完整代码如下:

#include<iostream>
using namespace std;
#define MAXEDGE 20
#define MAXVEX 20
typedef struct {int begin;int end;int weight;
}Edge;
typedef struct {Edge edge[MAXEDGE];int numEdges;
}MGraph;
void MiniSpanTree_KrusKal(MGraph& G);
int Find(int*parent, int f);int main() {MGraph G;//权值升序排序G.edge[0].begin = 4; G.edge[0].end = 7; G.edge[0].weight = 7;G.edge[1].begin = 2; G.edge[1].end = 8; G.edge[1].weight = 8;G.edge[2].begin = 0; G.edge[2].end = 1; G.edge[2].weight = 10;G.edge[3].begin = 0; G.edge[3].end = 5; G.edge[3].weight = 11;G.edge[4].begin = 1; G.edge[4].end = 8; G.edge[4].weight = 12;G.edge[5].begin = 3; G.edge[5].end = 7; G.edge[5].weight = 16;G.edge[6].begin = 1; G.edge[6].end = 6; G.edge[6].weight = 16;G.edge[7].begin = 5; G.edge[7].end = 6; G.edge[7].weight = 17;G.edge[8].begin = 1; G.edge[8].end = 2; G.edge[8].weight = 18;G.edge[9].begin = 6; G.edge[9].end = 7; G.edge[9].weight = 19;G.edge[10].begin = 3; G.edge[10].end = 4; G.edge[10].weight = 20;G.edge[11].begin = 3; G.edge[11].end = 8; G.edge[11].weight = 21;G.edge[12].begin = 2; G.edge[12].end = 3; G.edge[12].weight = 22;G.edge[13].begin = 3; G.edge[13].end = 6; G.edge[13].weight = 24;G.edge[14].begin = 4; G.edge[14].end = 5; G.edge[14].weight = 26;G.numEdges = 15;MiniSpanTree_KrusKal(G);system("pause");return 0;
}
void MiniSpanTree_KrusKal(MGraph& G) {int parent[MAXVEX];//parent用来找根结点for (int i = 0; i < MAXVEX; i++)parent[i] = -1;for (int i = 0; i < G.numEdges; i++) {//遍历每条边int b_root = Find(parent, G.edge[i].begin);//找各自集合的根结点int e_root = Find(parent, G.edge[i].end);if (b_root != e_root) {//假如b_root与e_root不相等,说明顶点G.edge[i].begin和顶点G.edge[i].end不在同一个集合,即说明边(G.edge[i].begin-->G.edge[i].end)没有与现有的生成树形成环路parent[e_root] = b_root;//把两个集合合并成一个,即令b_root的上级为e_root或令e_root的上级为b_root//parent[b_root] = e_root;//这样写也行,谁是上下级没关系cout << G.edge[i].begin << "-->" << G.edge[i].end << endl;}}
}
int Find(int*parent, int f) {//用来找根结点while (parent[f] != -1)f = parent[f];return f;
}

所以最终构成最小生成树的边如下:

200115(最小生成树的Kruskal算法(贪心))相关推荐

  1. 最小生成树:Kruskal算法 和 Prim算法(第23章)

    武侠: 飞雪连天射白鹿,笑书神侠倚碧鸳. --金庸十四著作 飞狐外传 .雪山飞狐 .连城诀 .天龙八部 .射雕英雄传 .白马啸西风 .鹿鼎记 .笑傲江湖 .书剑恩仇录 .神雕侠侣 .侠客岛 .倚天屠龙 ...

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

    盛年不重来,一日难再晨.及时当勉励,岁月不待人. <杂诗>陶渊明 目录 前言 一.Kruskal的几何思维 二.使用步骤 1.核心思想 2.全部测试代码 总结 前言 最小生成树算法有两种一 ...

  3. 最小生成树的Kruskal算法实现

    最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...

  4. 最小生成树的Kruskal算法-详解

    最小生成树的Kruskal算法 一. 什么是最小生成树 1.1 最小生成树定义: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最 ...

  5. kruskal算法c语言,最小生成树之Kruskal算法

    上一篇文章中提到了最小生成树的Prim算法,这一节继续探讨一下最小生成树的Kruskal算法.什么是最小生成树算法上文已经交代过了,所以我们直接从Kruskal的步骤开始介绍. 1.Kruskal算法 ...

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

    我们用现在来模拟一下Kruskal算法,下面给出一个无向图B,我们使用Kruskal来找无向图B的最小生成树. 首先,我们将所有的边都进行从小到大的排序.排序之后根据贪心准则,我们选取最小边(A,D) ...

  7. 最小生成树(Kruskal算法+Prim算法)简单讲解+最小生成树例题 acm寒假集训日记22/1/8

    算法简讲部分: Kruskal算法: 基于贪心策略大致过程分为第三步:1. 我们先用结构体把每条边的端点和权值记录下来,然后对每条边按权值进行排序2. 因为 使图连通最少需要n-1 条边,所以我们依次 ...

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

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

  9. 最小生成树之Kruskal算法

    图片描述 算法思想 采用贪婪策略,连续的按最小的权选择边,并且当边不产生圈时就把它作为取定的边 算法思路 问题出现 1.怎样选择最小权的边 用个排序算法 2.怎样判断加入的边是否会产生圈 (用到不相交 ...

最新文章

  1. MyBatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!
  2. mysql 给min值取别名_mysql基本命令
  3. python把英语句子成分字母_英语句子成分-谓语讲解 什么是谓语?(
  4. AI:2020年6月23日北京智源大会演讲分享之机器学习专题论坛——09:45-10:25邢波教授《A Blueprint of Standardized and Composable ML》
  5. 开发转测试没人要_前端开发,测试,后端,该如何选择?
  6. VC中ADO连接SQLSERVER的几种标准方式?
  7. 信息系统项目管理师论文_「高项论文」谨防信息系统项目管理师论文12个写作丢分点...
  8. 【Fiddler篇】Stave插件之环境映射
  9. Python开发第一篇 基础篇(下)
  10. Codeforces 2 A. Winner
  11. 数据库设计指南[整理]
  12. 重磅炸弹之英译世界名著137部
  13. ps插件套装imagenomic磨皮滤镜安装教程
  14. JS JQUERY获取两个时间相差几个月
  15. sklearn.impute.SimpleImputer 数据填充
  16. java图片无损压缩_java无损压缩Thumbnailator(google)
  17. 简单socket聊天小程序+socket简单封装
  18. 计算机网络子网斜杠后面的含义,ip地址后面的斜杠24是什么意思
  19. 微信支付v3 AEAD_AES_256_GCM解密JS版本代码及验证 javascript
  20. 新爹手记-分娩篇-出生前一天(原汁原味流水版)

热门文章

  1. Golang相关面试题
  2. linux .trash,linux下trash代替rm
  3. 贝壳找房值百亿美元吗?
  4. 一百多篇热门经典计算文章 来自 11 个热门的技术类微信公众
  5. 求通俗解释下bandit老虎机是个什么东西?
  6. android手机在线什么意思,用安卓手机登录QQ显示“手机在线”,为何苹果就显示iPhone在线?...
  7. 我爱你,没有什么目的:情感日志
  8. 尚硅谷 java基础第二个项目之客户关系管理系统
  9. 音频技术操作(重采样,增减益,混流,编解码及实际应用)
  10. switch完成输出星期一到七