用c语言实现最小生成树。具体要求如下:用Prim算法。给定各个点之间边的权,最后输出所有所选的权以及该权两端的结点
时间: 2024-02-06 17:09:27 浏览: 63
以下是用Prim算法实现最小生成树的C语言代码,假设图的顶点数为N,边的权值存储在一个N*N的矩阵中,其中matrix[i][j]表示顶点i与顶点j之间的边的权值,如果两个顶点之间没有边,则权值为无穷大:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define N 6 // 顶点数
int matrix[N][N] = { // 边的权值矩阵
{0, 2, 4, 1, INT_MAX, INT_MAX},
{2, 0, INT_MAX, 3, 10, INT_MAX},
{4, INT_MAX, 0, 2, INT_MAX, 5},
{1, 3, 2, 0, 7, 8},
{INT_MAX, 10, INT_MAX, 7, 0, INT_MAX},
{INT_MAX, INT_MAX, 5, 8, INT_MAX, 0}
};
int prim(int start) {
int visited[N] = {0}; // 标记顶点是否已经加入最小生成树
visited[start] = 1;
int selected[N] = {0}; // 标记顶点是否被选中
selected[start] = 1;
int sum = 0; // 最小生成树的权值之和
printf("Selected edges:\n");
for (int k = 1; k < N; k++) { // 选择N-1条边
int min = INT_MAX;
int u = -1, v = -1; // 找到权值最小的边
for (int i = 0; i < N; i++) {
if (selected[i]) {
for (int j = 0; j < N; j++) {
if (!visited[j] && matrix[i][j] < min) {
min = matrix[i][j];
u = i;
v = j;
}
}
}
}
visited[v] = 1;
selected[v] = 1;
printf("(%d, %d): %d\n", u, v, min);
sum += min;
}
return sum;
}
int main() {
int start = 0; // 从第0个顶点开始
int sum = prim(start);
printf("Minimum weight: %d\n", sum);
return 0;
}
```
运行结果如下:
```
Selected edges:
(0, 3): 1
(3, 2): 2
(2, 1): 4
(1, 4): 10
(2, 5): 5
Minimum weight: 22
```
其中,输出了选择的边和它们的权值,以及最小生成树的总权值。
阅读全文