C语言实现Kruskal算法,解决无向连通有权图的最小生成树问题,在控制台窗口输出最小生成树的边
时间: 2023-07-22 09:08:30 浏览: 89
以下是C语言实现Kruskal算法,解决无向连通有权图的最小生成树问题,并在控制台窗口输出最小生成树的边的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
#define MAX_EDGES 4950
typedef struct {
int from, to, weight;
} Edge;
int parent[MAX_VERTICES + 1];
Edge edges[MAX_EDGES];
int numVertices, numEdges;
void makeSet() {
int i;
for (i = 1; i <= numVertices; i++) {
parent[i] = i;
}
}
int find(int vertex) {
if (parent[vertex] != vertex) {
parent[vertex] = find(parent[vertex]);
}
return parent[vertex];
}
void unionSet(int from, int to) {
int rootFrom = find(from);
int rootTo = find(to);
parent[rootFrom] = rootTo;
}
int compare(const void *a, const void *b) {
Edge *edgeA = (Edge *)a;
Edge *edgeB = (Edge *)b;
return edgeA->weight - edgeB->weight;
}
void kruskal() {
int i, j, count = 0;
Edge currentEdge;
makeSet();
for (i = 0; i < numEdges; i++) {
currentEdge = edges[i];
if (find(currentEdge.from) != find(currentEdge.to)) {
unionSet(currentEdge.from, currentEdge.to);
printf("Edge %d: (%d, %d) weight = %d\n", count++, currentEdge.from, currentEdge.to, currentEdge.weight);
}
}
}
int main() {
int i;
printf("Enter the number of vertices: ");
scanf("%d", &numVertices);
printf("Enter the number of edges: ");
scanf("%d", &numEdges);
printf("Enter the edges: \n");
for (i = 0; i < numEdges; i++) {
scanf("%d %d %d", &edges[i].from, &edges[i].to, &edges[i].weight);
}
qsort(edges, numEdges, sizeof(Edge), compare);
printf("Minimum spanning tree:\n");
kruskal();
return 0;
}
```
在该代码中,我们首先定义了一个结构体Edge,用于表示一条边,包括该边的起点、终点和权重。然后,我们定义了一个parent数组,用于维护每个顶点的祖先,以及一个edges数组,用于存储所有的边。接下来,我们定义了makeSet、find和unionSet函数,分别用于初始化每个顶点的祖先、查找某个顶点的祖先和合并两个顶点的祖先。然后,我们定义了一个compare函数,用于比较两条边的权重大小,并使用qsort函数对所有的边按权重从小到大排序。最后,我们定义了一个kruskal函数,用于执行Kruskal算法,遍历所有的边并输出最小生成树的边。
在主函数中,我们首先读入图的顶点数和边数,然后读入所有的边,并对所有的边按权重从小到大排序。最后,我们调用kruskal函数执行Kruskal算法,并在控制台窗口输出最小生成树的边。
阅读全文