克鲁斯卡尔算法的个人解析笔记
什么是克鲁斯卡尔(kruskal)算法
这里我们选用普里姆(prim)算法作为对比,prim算法是从一个顶点开始搜索最小路径,而克鲁斯卡尔算法是通过一个遍历好的边集数组搜索出一条最短路径。(最短路径的本质就是最小生成树。)
克鲁斯卡尔算法与普里姆算法的区别在哪里呢
克鲁斯卡尔是从边集表出发,遍历图从而生成最小树。对于边数比较少的图来说相较于普里姆算法更游刃有余。即克鲁斯卡尔算法更适宜于稀疏图,普里姆算法适宜于稠密图。
##克鲁斯卡尔算法理论
如图1所示,这是一个有9个顶点15条边的图。
首先,先遍历所有边,将权值从小到大排序入数组。如图2所示,
再这个基础上,搜索出遍历所有顶点的最短路径。(并且是所有顶点联通的路径)(如图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