1. 克鲁斯卡尔算法简介

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

而具体的操作过程为:

a) 将图的所有连接线去掉,只剩顶点

b) 从图的边集数组中找到权值最小的边,将边的两个顶点连接起来

c)  继续寻找权值最小的边,将两个顶点之间连接起来,如果选择的边使得最小生成树出现了环路,则放弃该边,选择权值次小的边

d) 直到所有的顶点都被连接在一起并且没有环路,最小生成树就生成了。

2. 两个核心问题

问题一 对图的所有边按照权值大小进行排序。

问题二 将边添加到最小生成树中时,怎么样判断是否形成了回路。

问题一直接采用排序算法进行排序即可。

问题二的核心思想是记录处理,处理方式是:记录顶点在"最小生成树"中的终点,顶点的终点是"在最小生成树中与它连通的最大顶点"。然后每次需要将一条边添加到最小生存树时,判断该边的两个顶点的终点是否重合,重合的话则会构成回路。

3. 代码实现

依旧是仅供参考#include

#define MAXEDGE 100

#define MAXVERTEX 100

typedef struct Edge {

int begin;//边的起点

int end;  //边的终点

int wight;//边的权值

} Edge;

typedef struct Graph {

char vertex[MAXVERTEX];//顶点

Edge edges[MAXEDGE];//边

int numvertex,numedges;//顶点和边的个数

} MGraph;

void CreateGraph(MGraph* G) {

printf("请输入顶点和边的个数:\n");

scanf("%d%d", &G->numvertex, &G->numedges);

printf("请输入顶点:\n");

getchar();//利用该函数除去上一系我们在输入结束时按得回车符

for (int i = 0; i numvertex; i++) {

scanf("%c", &G->vertex[i]);

}

printf("按权值从小到大输入边(vi,vj)对应的起点和终点的下标,begin,end以及权值wight:\n");

for (int k = 0; k numedges; k++) {

Edge e;

scanf("%d%d%d", &e.begin, &e.end, &e.wight);

G->edges[k] = e;

}

}

int Find(int *parent, int f) {

while (parent[f]>0) {

f = parent[f];

}

return f;

}

//最小生成树,克鲁斯卡尔算法

void Kruskal(MGraph *G) {

int parent[MAXVERTEX];//存放最小生成树的顶点

for (int i = 0; i numvertex; i++) {

parent[i] = 0;

}

int m, n;

for (int i = 0; i numedges; i++) {

n = Find(parent, G->edges[i].begin);

m = Find(parent, G->edges[i].end);

if (n != m) { //m=n说明有环

parent[n] = m;

printf("(%d,%d) %d\t", G->edges[i].begin, G->edges[i].end, G->edges[i].wight);//打印边和权值

}

}

}

int main() {

MGraph G;

CreateGraph(&G);

Kruskal(&G);

return 0;

}

克鲁斯卡尔算法c语言,最小生成树-克鲁斯卡尔(Kruskal)算法相关推荐

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

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

  2. 基于C语言,详解Kruskal算法(利用并查集)实现构建最小生成树

    目录 一.Kruskal算法的基本介绍 具体做法:找出森林中连接任意两棵树的所有边中,具有最小权值的边,如果将它加入生成树中不产生回路,则它就是生成树中的一条边.这里的关键就是如何判断"将它 ...

  3. 最小生成树(Prim、Kruskal)算法,秒懂!

    前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚,什么是最小生成树? 一个有 n 个结点的连通图的生成树是原图的极小连通子 ...

  4. 最小生成树 kruskal_使用Kruskal算法求解Java最小生成树问题

    最小生成树 kruskal In Electronic Circuit we often required less wiring to connect pins together. We can m ...

  5. 数据结构与算法A实验六图论---7-4 公路村村通(最小生成树Prime和Kruskal算法)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...

  6. mst算法matlab_基于并查集+Kruskal算法的matlab程序及最小生成树绘图

    学了一天最小生成树,稍稍总结一下,这是第一篇 kruskal算法 关于kruskal算法已有大量的资料,不再赘述,算法流程为: 得到邻接矩阵和权值: 初始化,连接距离最小的两点: 连接距离次小的两点, ...

  7. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  8. 最小生成树原理及Kruskal算法的js实现

    1. 生成树和最小生成树的概念 设图G(V,E)连通,则 生成树:包含图G(V,E)中的所有节点,及|V|-1条边的连通图,一个图的生成树可以有多颗 最小生成树:最小权重生成树,在生成树的概念上加一个 ...

  9. c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...

    以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...

最新文章

  1. 整型数组负数放左面,其他放右面,要求时空复杂度:O(n), O(1)。
  2. 世界人工智能大赛方案解析!
  3. 统计学中的协方差矩阵(阵列信号基础)
  4. 项目经理的超越(一)你超越了吗?
  5. clickhouse 的mysql表引擎
  6. ROS的学习(十二)用C++写一个简单的发布者
  7. POJ3414 Pots —— BFS + 模拟
  8. sublime text3找到定义_决策易aPaaS,一款非技术人员也能使用的自定义开发神器
  9. 11 种主要神经网络结构图解
  10. GitHub创建仓库
  11. No coverage information was collected, exit without writing coverage informa
  12. 电脑打开“我的电脑”、“资源管理器”很慢的解决办法。
  13. dede栏目文章数与实际数不符
  14. sklearn中的特征工程(过滤法、嵌入法和包装法)
  15. bss段,data段、text段、堆heap和栈stack
  16. @SuppressLint(“XXXXXXX”)分析
  17. 入门 | 我们常听说的置信区间与置信度到底是什么?
  18. 查找算法【平衡二叉树】 - 平衡二叉树的创建
  19. 梦幻西游手游:工坊进阶考试题目攻略—考古、乐艺篇
  20. 每日一练蓝桥杯C语言:暴力枚举

热门文章

  1. 17、微信小程序——城市定位
  2. 掌控移动入口:互联网手机的伪命题?
  3. ExpressBox 7 – RAS
  4. 笔记本电脑一键关闭显示屏
  5. Windows上DB2 UDB脚本编制简介2
  6. centos rpm安装mysql时依赖检测失败:mysql57-community-release 与 mysql80-community-release-el8-3.noarch 冲突
  7. 实施需要掌握的linux命令,开发人员需要掌握的日常Linux命令集
  8. Nginx的核心原理解析
  9. 利用Matlab 解决二维矩阵问题
  10. 云时代,JAVA何去何从?