帮我用c语言写克鲁斯卡尔求最小生成数的程序
时间: 2024-02-13 12:03:26 浏览: 73
.编写实现克鲁斯卡尔算法的程序,求最小生成树。
4星 · 用户满意度95%
好的,以下是用 C 语言实现克鲁斯卡尔算法求解最小生成树的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100
#define INF 65535
typedef struct
{
int from; // 边的起点
int to; // 边的终点
int weight; // 边的权值
} Edge;
int Find(int parent[], int f) // 查找连通分量的根节点
{
while (parent[f] > 0)
f = parent[f];
return f;
}
void Kruskal(Edge edges[], int n, int e)
{
int i, j, k;
int parent[MAXVEX]; // 记录各个连通分量的根节点
for (i = 0; i < n; i++)
parent[i] = 0; // 初始化为 0,表示各点都是独立的连通分量
for (i = 0; i < e; i++)
{
int from = edges[i].from;
int to = edges[i].to;
int weight = edges[i].weight;
int root1 = Find(parent, from);
int root2 = Find(parent, to);
if (root1 != root2) // 如果不在同一连通分量中,则将两个连通分量合并
{
parent[root1] = root2;
printf("(%d, %d) %d\n", from, to, weight);
}
}
}
int main()
{
int n, e;
printf("请输入节点数和边数:");
scanf("%d%d", &n, &e);
Edge edges[e];
printf("请输入边的信息:\n");
for (int i = 0; i < e; i++)
{
scanf("%d%d%d", &edges[i].from, &edges[i].to, &edges[i].weight);
}
for (int i = 0; i < e-1; i++) // 对边按照权值从小到大排序
{
for (int j = i+1; j < e; j++)
{
if (edges[i].weight > edges[j].weight)
{
Edge temp = edges[i];
edges[i] = edges[j];
edges[j] = temp;
}
}
}
printf("最小生成树的边为:\n");
Kruskal(edges, n, e);
return 0;
}
```
其中,`Edge` 结构体表示一条边,`Find` 函数用来查找连通分量的根节点,`Kruskal` 函数实现了克鲁斯卡尔算法求解最小生成树。在主函数中,首先输入节点数和边数,然后输入每条边的信息,最后按照权值从小到大排序,调用 `Kruskal` 函数求解最小生成树。
阅读全文