C语言实现Kruskal算法(最小生成树)
Kruskal算法是求连通网的最小生成树的一种方法,适用于边稀疏的网。相比于Prim算法,Kruskal算法的时间复杂度为O(elog e),其中e为网中的边数。
算法基本思想:
- 将所有边按照边权从小到大排序;
- 依次从小到大选择各边,如果这条边加入后与已选节点之间不会形成环,则选择该边,并将其加入最小生成树中。
在实现时,需要使用并查集来判断是否形成环。
以下是C语言实现Kruskal算法的完整源代码:
#include <stdio.h>
#define MAX_EDGE_NUM 100 // 最多边数
#define MAX_VERTEX_NUM 50 // 最多顶点数
// 定义边结构体
typedef struct Edge {
int start; // 边的起点
int end; // 边的终点
int weight; // 边的权值
} Edge;
int edgeNum = 0; // 边的数量
int vertexNum = 0; // 顶点的数量
int father[MAX_VERTEX_NUM]; // 并查集数组,记录每个顶点的父亲
// 初始化并查集数组
void init() {
for (int i = 0; i < vertexN