c语言中根据kruskal算法,实现求最小生成树代码。
时间: 2024-02-27 17:59:13 浏览: 80
以下是使用C语言实现Kruskal算法求最小生成树的代码。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100 // 最大顶点数
#define MAXEDGE 100 // 最大边数
typedef struct Edge {
int u, v; // 边的两个端点
int w; // 边的权值
}Edge;
typedef struct {
int vexs[MAXVEX]; // 顶点集合
Edge edges[MAXEDGE]; // 边集合
int n, e; // 顶点数和边数
}Graph;
// 初始化图
void initGraph(Graph *G) {
int i, j;
G->n = G->e = 0;
for (i = 0; i < MAXVEX; i++) {
G->vexs[i] = i; // 默认顶点编号为0~n-1
}
for (i = 0; i < MAXEDGE; i++) {
G->edges[i].u = G->edges[i].v = G->edges[i].w = 0;
}
}
// 添加边
void addEdge(Graph *G, int u, int v, int w) {
G->edges[G->e].u = u;
G->edges[G->e].v = v;
G->edges[G->e].w = w;
G->e++;
}
// 交换两个结构体变量
void swap(Edge *a, Edge *b) {
Edge tmp = *a;
*a = *b;
*b = tmp;
}
// 快速排序
void quickSort(Edge *edges, int low, int high) {
if (low < high) {
int i = low, j = high;
Edge pivot = edges[low];
while (i < j) {
while (i < j && edges[j].w >= pivot.w) j--;
edges[i] = edges[j];
while (i < j && edges[i].w <= pivot.w) i++;
edges[j] = edges[i];
}
edges[i] = pivot;
quickSort(edges, low, i - 1);
quickSort(edges, i + 1, high);
}
}
// 查找顶点的祖先
int find(int *parent, int f) {
while (parent[f] > 0) {
f = parent[f];
}
return f;
}
// Kruskal算法求最小生成树
void kruskal(Graph *G) {
int i, u, v, m = G->e;
int parent[MAXVEX] = { 0 }; // 记录顶点的祖先
quickSort(G->edges, 0, m - 1); // 对边进行排序
for (i = 0; i < m; i++) {
u = find(parent, G->edges[i].u);
v = find(parent, G->edges[i].v);
if (u != v) { // 如果两个顶点不在同一个集合中,说明不会形成环
parent[u] = v;
printf("(%d, %d) weight=%d\n", G->edges[i].u, G->edges[i].v, G->edges[i].w);
}
}
}
int main() {
Graph G;
initGraph(&G);
addEdge(&G, 0, 1, 10);
addEdge(&G, 0, 5, 11);
addEdge(&G, 1, 6, 16);
addEdge(&G, 1, 2, 18);
addEdge(&G, 2, 6, 19);
addEdge(&G, 2, 3, 22);
addEdge(&G, 3, 6, 24);
addEdge(&G, 3, 4, 20);
addEdge(&G, 4, 6, 6);
addEdge(&G, 4, 5, 26);
kruskal(&G);
return 0;
}
```
这是一个简单的例子,通过添加 `addEdge` 函数来添加边,使用 `kruskal` 函数来求最小生成树。其中 `quickSort` 函数用于对边进行快速排序,`find` 函数用于查找顶点的祖先。
阅读全文