帮我用c语言写一个最小生成树
时间: 2023-11-14 12:07:00 浏览: 89
最小生成树有很多种生成方法,主要有普利姆算法和克鲁斯卡尔算法,通过C语言easyx图形库实现
5星 · 资源好评率100%
好的,下面是使用Prim算法实现最小生成树的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define VERTICES 5 // 顶点数
int graph[VERTICES][VERTICES] = {
{0, 2, 0, 6, 0},
{2, 0, 3, 8, 5},
{0, 3, 0, 0, 7},
{6, 8, 0, 0, 9},
{0, 5, 7, 9, 0}
};
int minKey(int key[], int visited[]) {
int min = INT_MAX, minIndex;
for (int i = 0; i < VERTICES; i++) {
if (!visited[i] && key[i] < min) {
min = key[i];
minIndex = i;
}
}
return minIndex;
}
void primMST() {
int parent[VERTICES]; // 最小生成树的父节点
int key[VERTICES]; // 顶点的权值
int visited[VERTICES] = {0}; // 记录顶点是否已经加入最小生成树
// 初始化 key 数组
for (int i = 0; i < VERTICES; i++) {
key[i] = INT_MAX;
}
key[0] = 0; // 从第一个顶点开始构造最小生成树
parent[0] = -1; // 第一个顶点没有父节点
for (int i = 0; i < VERTICES - 1; i++) {
int u = minKey(key, visited); // 找到权值最小的顶点
visited[u] = 1; // 将该顶点加入最小生成树
for (int v = 0; v < VERTICES; v++) {
if (graph[u][v] && !visited[v] && graph[u][v] < key[v]) {
parent[v] = u;
key[v] = graph[u][v];
}
}
}
// 输出最小生成树
printf("Edge \tWeight\n");
for (int i = 1; i < VERTICES; i++) {
printf("%d - %d \t%d\n", parent[i], i, graph[parent[i]][i]);
}
}
int main() {
primMST();
return 0;
}
```
这段代码使用了邻接矩阵来表示图,可以根据需要修改 `graph` 数组来表示不同的图。在这里,我使用了一个五个顶点的图作为示例,你可以根据需要修改顶点数和边的权值来测试代码。
阅读全文