数据结构--克鲁斯卡尔(kruskal)算法(大话数据结构)

什么是克鲁斯卡尔(kruskal)算法

这里我们选用普里姆(prim)算法作为对比,prim算法是从一个顶点开始搜索最小路径,而克鲁斯卡尔算法是通过一个遍历好的边集数组搜索出一条最短路径。(最短路径的本质就是最小生成树。)

克鲁斯卡尔算法与普里姆算法的区别在哪里呢

克鲁斯卡尔是从边集表出发,遍历图从而生成最小树。对于边数比较少的图来说相较于普里姆算法更游刃有余。即克鲁斯卡尔算法更适宜于稀疏图,普里姆算法适宜于稠密图。

##克鲁斯卡尔算法理论
图1
如图1所示,这是一个有9个顶点15条边的图。
首先,先遍历所有边,将权值从小到大排序入数组。如图2所示,
图2
再这个基础上,搜索出遍历所有顶点的最短路径。(并且是所有顶点联通的路径)(如图3所示)
图3
以上就是大概的思路了。

克鲁斯卡尔算法实现

宏定义

#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100
#define INFINITY 65535 //65535代表无穷大

对边集数组进行定义

typedef struct {
   
	int begin;    //记录边的起始顶点
	int end;      //记录边的终点
	int weight;   //记录边的权值
}Edge;

创建邻接矩阵的代码由于太占篇幅,所以省略了,不过有兴趣的可以查看
邻接矩阵

克鲁斯卡尔算法

void MiniSpanTree_Kruskal(MGraph G)
{
   
	int i, m;
	int parent[MAXVEX];
	int j, w, t;
	int n = 0;
	int k = 0;
	Edge edges[MAXVEX];

	while (k<G.numEdges)        //建立边集数组
	{
   
		int min = INFINITY;
		for (i = 0; i < G.numVertexes; i++)
		{
   
			for (j = 0; j < G.numVertexes; j++)
			{
   
				if 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aitee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值