c语言 写一个最小生成树
时间: 2023-07-13 10:38:54 浏览: 89
最小生成树有很多种生成方法,主要有普利姆算法和克鲁斯卡尔算法,通过C语言easyx图形库实现
5星 · 资源好评率100%
以下是使用 Prim 算法实现的最小生成树的 C 代码:
```c
#include <stdio.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 findMinKey(int keys[], int visited[]) {
int minKey = INT_MAX, minVertex;
for (int v = 0; v < VERTICES; ++v) {
if (!visited[v] && keys[v] < minKey) {
minKey = keys[v];
minVertex = v;
}
}
return minVertex;
}
void printMST(int parent[]) {
printf("Edge Weight\n");
for (int i = 1; i < VERTICES; ++i) {
printf("%d - %d %d\n", parent[i], i, graph[i][parent[i]]);
}
}
void primMST() {
int parent[VERTICES], keys[VERTICES], visited[VERTICES];
for (int i = 0; i < VERTICES; ++i) {
keys[i] = INT_MAX;
visited[i] = 0;
}
keys[0] = 0;
parent[0] = -1;
for (int i = 0; i < VERTICES - 1; ++i) {
int u = findMinKey(keys, visited);
visited[u] = 1;
for (int v = 0; v < VERTICES; ++v) {
if (graph[u][v] && !visited[v] && graph[u][v] < keys[v]) {
parent[v] = u;
keys[v] = graph[u][v];
}
}
}
printMST(parent);
}
int main() {
primMST();
return 0;
}
```
这个实现假设了一个有5个顶点的图,图的边缘权重已经在2D数组中指定。 代码使用 Prim 算法来找到最小生成树,输出最小生成树的边缘权重和。
阅读全文