最小生成树之Kruskal算法
图片描述
算法思想
采用贪婪策略,连续的按最小的权选择边,并且当边不产生圈时就把它作为取定的边
算法思路
问题出现
1.怎样选择最小权的边
用个排序算法
2.怎样判断加入的边是否会产生圈
(用到不相交集的知识)
判断边的两个端点是否在同一棵树中,若处于同一棵树则会产生圈
思路
1.将边的权值将边按升序排序
2.每次选择最小的边,判断两个端点是否是等价类,不是则加入这条边并且合并这两个端点
3.如此重复1-2步骤到所有边都被处理
代码实现
#include <iostream> #include <algorithm> #include <cstdlib>using namespace std;#define VERSIZE 9 //顶点数 #define MAXSIZE 15//边数typedef struct node EDGE; typedef int Vertex; typedef int Position;struct node {Vertex start;//边起始顶点Vertex end;//边结束顶点int weigth;//权重 }Edge[MAXSIZE];int VerSet[VERSIZE];//存储顶点的集合//初始化集合 void InitSet(int VerSet[],int n) {int i = 0;for (i = 1; i <= n; i++)VerSet[i] = -1; }//读图并初始化 void ReadGraph(EDGE Edge[], int m)//边数m {int i = 0;for (i = 0; i < m; i++){cout << "请输入第" << i+1 << "条边:";cin >> Edge[i].start;cin >> Edge[i].end;cout << "请输入边" << "(" << Edge[i].start << "," << Edge[i].end << ")" << "的权重:";cin >> Edge[i].weigth;} }//找出顶点在哪颗树 Position Find(int VerSet[], Vertex x) {if (VerSet[x] < 0)return x;elsereturn VerSet[x] = Find(VerSet, VerSet[x]); }//合并两个顶点与一棵树 void Union(int VerSet[], Vertex x, Vertex y) {Vertex root1 = Find(VerSet,x);Vertex root2 = Find(VerSet,y);if (VerSet[root1] > VerSet[root2])VerSet[root1] = root2;else{if (VerSet[root1] == VerSet[root2])VerSet[root1]--;VerSet[root2] = root1;} }int kruskal(EDGE Edge[],int VerSet[],int m) {int sum = 0;int i = 0;for (i = 0; i < m; i++){if (Find(VerSet, Edge[i].start) != Find(VerSet, Edge[i].end))//判断两个端点是否在同一棵树中 {Union(VerSet, Edge[i].start, Edge[i].end);//合并两个顶点sum += Edge[i].weigth;cout << "边" << Edge[i].start << "," << Edge[i].end << endl;//输出选择的边 }}return sum; }bool compare(EDGE a,EDGE b) {return a.weigth < b.weigth; }int main() {int n = 7;int m = 12;InitSet(VerSet, n);ReadGraph(Edge, m);sort(Edge, Edge + n , compare);for (int i = 0; i < m; i++){cout << Edge[i].weigth << " ";}cout << endl;cout << "最小生成树为:" << kruskal(Edge, VerSet, m) << endl;system("pause");return 0; }
实验结果
修改补充后的:SakuraOne Kruskal算法
转载于:https://www.cnblogs.com/myworld7/p/7470542.html
最小生成树之Kruskal算法相关推荐
- 最小生成树的Kruskal算法实现
最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...
- 最小生成树:Kruskal算法 和 Prim算法(第23章)
武侠: 飞雪连天射白鹿,笑书神侠倚碧鸳. --金庸十四著作 飞狐外传 .雪山飞狐 .连城诀 .天龙八部 .射雕英雄传 .白马啸西风 .鹿鼎记 .笑傲江湖 .书剑恩仇录 .神雕侠侣 .侠客岛 .倚天屠龙 ...
- 数据结构------最小生成树之Kruskal算法
盛年不重来,一日难再晨.及时当勉励,岁月不待人. <杂诗>陶渊明 目录 前言 一.Kruskal的几何思维 二.使用步骤 1.核心思想 2.全部测试代码 总结 前言 最小生成树算法有两种一 ...
- 最小生成树的Kruskal算法-详解
最小生成树的Kruskal算法 一. 什么是最小生成树 1.1 最小生成树定义: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最 ...
- kruskal算法c语言,最小生成树之Kruskal算法
上一篇文章中提到了最小生成树的Prim算法,这一节继续探讨一下最小生成树的Kruskal算法.什么是最小生成树算法上文已经交代过了,所以我们直接从Kruskal的步骤开始介绍. 1.Kruskal算法 ...
- ds图—最小生成树_Java: Kruskal算法生成最小生成树(邻接矩阵)
Java: Kruskal算法生成最小生成树(邻接矩阵): package 输出: Kruskal=36: (E,F) (C,D) (D,E) (B,F) (E,G) (A,B) 分析: Java: ...
- python【数据结构与算法】最小生成树之Kruskal算法
我们用现在来模拟一下Kruskal算法,下面给出一个无向图B,我们使用Kruskal来找无向图B的最小生成树. 首先,我们将所有的边都进行从小到大的排序.排序之后根据贪心准则,我们选取最小边(A,D) ...
- 最小生成树学习-Kruskal算法
转载请注明来源 最小生成树简单的来说就是从无向连通图的邻接表或者邻接矩阵中扣下来一棵权值最小的树,他只有n-1条边来连接n个顶点,并且不允许产生回路. Kruskal算法首先要对边进行排序,sort一 ...
- 最小生成树(Kruskal算法+Prim算法)简单讲解+最小生成树例题 acm寒假集训日记22/1/8
算法简讲部分: Kruskal算法: 基于贪心策略大致过程分为第三步:1. 我们先用结构体把每条边的端点和权值记录下来,然后对每条边按权值进行排序2. 因为 使图连通最少需要n-1 条边,所以我们依次 ...
最新文章
- python使用input函数时、必须添加提示文字-浅谈python3中input输入的使用
- ckeditor上传图片文件,研究了一天,终于...
- 实心等腰直角三角形。
- P6 计算机系统的层次结构
- Java 内存 关系_发生在Java内存模型中的关系之前
- 信息学奥赛一本通 2021:【例4.6】最大公约数
- 广度优先搜索——USACO08FEB(洛谷 P2895)
- Git配置安装使用教程操作github上传克隆数据
- hdu 3560(dfs判环)
- 分库分表 vs NewSQL,怎么选择?
- Python编程从入门到实践(基础入门)
- 完整的连接器设计手册_连接器设计中,仿真技术提供了力学理论依据
- 最新二开版本的源码博客论坛源码,UI很漂亮。
- 【Paper】WISDM:Activity Recognition using Cell Phone Accelerometers
- java版怎么上hypixel,来场速建吧!Hypixel入驻《我的世界》中国版
- React中的PureComponent,refs
- 游戏系统开发设计分享
- linux下双网卡设置(内外网)
- 解决Mac使用SVN命令出现xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)的问题
- 对话依图医疗总裁倪浩:AI 产品只是第一步,未来要和医院制定中国儿童骨龄新标准...