克鲁斯卡尔算法c语言,最小生成树-克鲁斯卡尔(Kruskal)算法
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)算法相关推荐
- kruskal算法c语言,最小生成树之Kruskal算法
上一篇文章中提到了最小生成树的Prim算法,这一节继续探讨一下最小生成树的Kruskal算法.什么是最小生成树算法上文已经交代过了,所以我们直接从Kruskal的步骤开始介绍. 1.Kruskal算法 ...
- 基于C语言,详解Kruskal算法(利用并查集)实现构建最小生成树
目录 一.Kruskal算法的基本介绍 具体做法:找出森林中连接任意两棵树的所有边中,具有最小权值的边,如果将它加入生成树中不产生回路,则它就是生成树中的一条边.这里的关键就是如何判断"将它 ...
- 最小生成树(Prim、Kruskal)算法,秒懂!
前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚,什么是最小生成树? 一个有 n 个结点的连通图的生成树是原图的极小连通子 ...
- 最小生成树 kruskal_使用Kruskal算法求解Java最小生成树问题
最小生成树 kruskal In Electronic Circuit we often required less wiring to connect pins together. We can m ...
- 数据结构与算法A实验六图论---7-4 公路村村通(最小生成树Prime和Kruskal算法)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...
- mst算法matlab_基于并查集+Kruskal算法的matlab程序及最小生成树绘图
学了一天最小生成树,稍稍总结一下,这是第一篇 kruskal算法 关于kruskal算法已有大量的资料,不再赘述,算法流程为: 得到邻接矩阵和权值: 初始化,连接距离最小的两点: 连接距离次小的两点, ...
- rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)
原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...
- 最小生成树原理及Kruskal算法的js实现
1. 生成树和最小生成树的概念 设图G(V,E)连通,则 生成树:包含图G(V,E)中的所有节点,及|V|-1条边的连通图,一个图的生成树可以有多颗 最小生成树:最小权重生成树,在生成树的概念上加一个 ...
- c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...
以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...
最新文章
- 整型数组负数放左面,其他放右面,要求时空复杂度:O(n), O(1)。
- 世界人工智能大赛方案解析!
- 统计学中的协方差矩阵(阵列信号基础)
- 项目经理的超越(一)你超越了吗?
- clickhouse 的mysql表引擎
- ROS的学习(十二)用C++写一个简单的发布者
- POJ3414 Pots —— BFS + 模拟
- sublime text3找到定义_决策易aPaaS,一款非技术人员也能使用的自定义开发神器
- 11 种主要神经网络结构图解
- GitHub创建仓库
- No coverage information was collected, exit without writing coverage informa
- 电脑打开“我的电脑”、“资源管理器”很慢的解决办法。
- dede栏目文章数与实际数不符
- sklearn中的特征工程(过滤法、嵌入法和包装法)
- bss段,data段、text段、堆heap和栈stack
- @SuppressLint(“XXXXXXX”)分析
- 入门 | 我们常听说的置信区间与置信度到底是什么?
- 查找算法【平衡二叉树】 - 平衡二叉树的创建
- 梦幻西游手游:工坊进阶考试题目攻略—考古、乐艺篇
- 每日一练蓝桥杯C语言:暴力枚举