数据结构—Kruskal最小生成树

原理:参考趣学数据结构

代码:

快速排序:

#pragma once
#define elemType int
typedef struct vER {elemType u;elemType v;int weight;
}VER;
int quickSort(VER a[], int l, int h) {//快速排序int i = l, j = h;VER p = a[l];while (i < j) {while (i<j&&a[j].weight>p.weight) {//从右往左遍历查找比p更小的元素j--;}if (i < j) {a[i++] = a[j];}while (i < j&&a[i].weight <= p.weight) {//从左往右遍历查找比p更大的元素i++;}if (i < j) {a[j--] = a[i];}}a[i] = p;//分界的值,左边小于等于p,右边大于preturn  i;
}
void fenZhi(VER a[], int l, int h) {//分治if (l < h) {int mid = quickSort(a, l, h);//以mid为分界线,进行分治,然后递归下去排序fenZhi(a, l, mid - 1);fenZhi(a, mid + 1, h);}
}

Kruskal代码:

#include<stdio.h>
#include<stdlib.h>
#include"quickSort.h"
#define N 100
#define elemType int
//const int MAX_INT = (1 << 31) - 1;
//const int MAX_INT = 0X7fffffff;
#define  INF    (((unsigned int)(-1)) >> 1)
int visited[N];
typedef struct GraphMatrix {elemType vNode[N][N];int vNum, eNum;
}GraphMatrix;
void initGMaxtix(GraphMatrix &G) {//初始化邻接矩阵printf("输入顶点数和边数\n");scanf_s("%d%d", &G.vNum, &G.eNum);for (int i = 0; i < G.vNum; i++) {//初始化邻接矩阵for (int j = 0; j < G.vNum; j++) {G.vNode[i][j] = INF;}}printf("输入顶点v1到顶点v2和其边的权重\n");for (int i = 0; i < G.eNum; i++) {int v1, v2, weights;scanf_s("%d%d%d", &v1, &v2, &weights);G.vNode[v1][v2] = weights;}
}
void print16(GraphMatrix G) {printf("邻接矩阵如下:\n");for (int i = 0; i < G.vNum; i++) {for (int j = 0; j < G.vNum; j++) {printf("%d ", G.vNode[i][j]);}printf("\n");}
}
bool merge(int u, int v,int vNum) {//把所有是与v顶点同一个集合的 加入到与u顶点的同一个集合int p = visited[u];int q = visited[v];if (p == q) {//同一个集合return false;}for (int i = 0; i < vNum; i++) {if (visited[i] == q) {visited[i] = p;}}return true;
}
void Kruskal(GraphMatrix G, int gouZaoSCTreeENum) {//最小生成树VER a[N];int k = 0;//构造结构体顶点之间权重数组for (int i = 0; i < G.vNum; i++) {for (int j = 0; j < G.vNum; j++) {if (G.vNode[i][j] < INF) {//有边a[k].u = i;a[k].v = j;a[k].weight = G.vNode[i][j];k++;}}}//对边权重进行快速排序fenZhi(a, 0, k - 1);int ans = 0;int n = G.eNum;for (int i = 0; i < gouZaoSCTreeENum; i++) {if (merge(a[i].u, a[i].v, G.vNum)) {ans += a[i].weight;printf("\n%d-----%d有边\n", a[i].u, a[i].v);n--;if (n == 1) {printf("\n最小生成树的边的总长度为%d\n", ans);break;}}}
}
int main() {GraphMatrix G;initGMaxtix(G);print16(G);printf("\n");for (int i = 0; i < G.vNum; i++) {//首先初始化G.vNum个集合visited[i] = i;}printf("Kruskal最小生成树\n");Kruskal(G, G.eNum);printf("\n");system("pause");return 0;
}

测试截图:

时间复杂度O(nlogn),空间复杂度O(n)

如果存在什么问题,欢迎批评指正!谢谢!

数据结构---Kruskal最小生成树相关推荐

  1. 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题...

    在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...

  2. 数据结构---prim最小生成树

    数据结构-prim最小生成树 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 100 #defin ...

  3. 数据结构之最小生成树

    prime算法 普里姆(Prim)算法,是用来求加权连通图的最小生成树的算法. 基本思想 对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G ...

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

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

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

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

  6. poj_2349 Kruskal 最小生成树

    题目大意 给定N个点的坐标,这N个点之间需要进行通讯.通讯方式可以采用卫星通信或无线通信,若两点之间采用为卫星通信,则两点之间的距离无限制,若采用无线通讯,则两点之间的距离不能大于某个值D.      ...

  7. hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1233 模板题,kruskal求最小生成树. 并查集是个好东西啊  就是注意一点 输入边的信息时,角标 ...

  8. LeetCode 1489. 找到最小生成树里的关键边和伪关键边(并查集+kruskal最小生成树)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, w ...

  9. poj 2031Building a Space Station(几何判断+Kruskal最小生成树)

    1 /* 2 最小生成树 + 几何判断 3 Kruskal 球心之间的距离 - 两个球的半径 < 0 则说明是覆盖的!此时的距离按照0计算 4 */ 5 #include<iostream ...

最新文章

  1. luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)
  2. 基于MySQL数据库下亿级数据的分库分表
  3. Python数据清理之解析XLRD文件
  4. keygen基本流程
  5. PHP 读写TXT与Mysql性能测试
  6. 网站 java php_做网站用java还是php
  7. [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证
  8. 比特币钱包(5) BIP44 账户表示形式
  9. Android大图片裁剪终极解决方案 原理分析
  10. Bootstrap富文本编辑器-bootstrap-wysiwyg
  11. iphone储存空间系统怎么清理_教你快速清理 iPhone 系统缓存垃圾,拒绝卡顿!
  12. leetcode 75
  13. java顺序存储_顺序存储-数据结构-java实现
  14. Python 变量赋值
  15. 现在很多人都在网上找富业
  16. hive jdbc连接时的乱码问题
  17. MATLAB实现频数直方图——hist的使用
  18. 绘制自己组合的k线图_史上最全K线图大全:搞懂70种K线组合形态,轻松低买高卖不踏空...
  19. 真正UltraISO 9.5.5.2960中文完美注册版
  20. 二本考中南计算机学硕,二本考上中南财经政法大学经济法学硕的经验

热门文章

  1. Android之SharedPreferences 存储复杂对象
  2. Andorid之bitmap里面的压缩总结
  3. 《零基础看得懂的C++入门教程 》——(5) 容我套个娃 循环
  4. tensorflow去掉某一维度_在Python中解压缩(取消堆栈)一个输入(占位符),在tensorflow中有一个None维度...
  5. 超级智能玩具《小小机器人》|全新50种玩法,创造力之源
  6. 我们计划招收300名学员,免费攻读人工智能专业
  7. 学习 Python 编程的 19 个资源
  8. Logistic回归主要应用领域
  9. 湘乡江南计算机学校,湘乡职业中等专业学校2021年招生录取分数线
  10. 面试常见问题_软件实施工程师面试中的常见问题都有哪些呢?