c语言实现Kruskal算法,解决如下无向连通有权图的最小生成树问题,在控制台窗口输出最小生成树的边,并把结果画出
时间: 2024-05-14 11:16:36 浏览: 128
以下是C语言实现Kruskal算法的代码,注释中有详细解释。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_EDGE_NUM 100 // 最大边数
struct Edge {
int u, v, w; // 一条边的两个端点及其权重
} edges[MAX_EDGE_NUM];
int parent[MAX_EDGE_NUM]; // 存储每个节点的祖先
int edge_num, vertex_num; // 边数和节点数
// 比较两条边的权重大小
int cmp(const void* a, const void* b) {
const struct Edge* ea = (struct Edge*)a;
const struct Edge* eb = (struct Edge*)b;
return ea->w - eb->w;
}
// 查找节点的祖先(采用路径压缩)
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
// 合并两个集合
void merge(int x, int y) {
int px = find(x);
int py = find(y);
parent[px] = py;
}
// Kruskal算法
void kruskal() {
// 初始化每个节点的祖先为自身
for (int i = 0; i < vertex_num; i++) {
parent[i] = i;
}
// 对所有边按权重从小到大排序
qsort(edges, edge_num, sizeof(struct Edge), cmp);
int selected_edge_num = 0; // 已选的边数
// 对每条边进行判断,如果两个端点不在同一个集合中,则将其合并,并输出该边
for (int i = 0; i < edge_num && selected_edge_num < vertex_num - 1; i++) {
int u = edges[i].u;
int v = edges[i].v;
if (find(u) != find(v)) {
merge(u, v);
printf("%d-%d %d\n", u, v, edges[i].w);
selected_edge_num++;
}
}
}
int main() {
// 读入边数和节点数
scanf("%d%d", &vertex_num, &edge_num);
// 读入每条边的信息
for (int i = 0; i < edge_num; i++) {
scanf("%d%d%d", &edges[i].u, &edges[i].v, &edges[i].w);
}
kruskal();
return 0;
}
```
由于无法在控制台窗口中画出图形,建议使用图形化界面进行展示。
阅读全文
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)