用c语言编程代码,Prim算法创建最小生成树
时间: 2024-02-28 11:55:49 浏览: 61
贪心算法实现最小生成树
5星 · 资源好评率100%
以下是使用C语言实现Prim算法创建最小生成树的代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define N 100
int graph[N][N]; // 存储图的邻接矩阵
int parent[N]; // 存储每个节点在最小生成树中的父节点
int key[N]; // 存储每个节点到最小生成树的最小权值
bool visited[N]; // 存储每个节点是否已经加入最小生成树
int n; // 节点个数
// 从未加入最小生成树的节点中找到到树的距离最短的节点
int minKey()
{
int min = 0x7fffffff, minIndex;
for (int i = 0; i < n; i++) {
if (!visited[i] && key[i] < min) {
min = key[i];
minIndex = i;
}
}
return minIndex;
}
// 使用Prim算法创建最小生成树
void prim()
{
// 初始化
for (int i = 0; i < n; i++) {
visited[i] = false;
key[i] = 0x7fffffff;
}
key[0] = 0;
parent[0] = -1;
// 逐步加入节点
for (int i = 0; i < n - 1; i++) {
int u = minKey();
visited[u] = true;
for (int v = 0; v < n; v++) {
if (graph[u][v] && !visited[v] && graph[u][v] < key[v]) {
parent[v] = u;
key[v] = graph[u][v];
}
}
}
}
int main()
{
// 读入图的邻接矩阵和节点个数
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &graph[i][j]);
}
}
// 使用Prim算法创建最小生成树
prim();
// 输出最小生成树的边和权值
printf("Edge \tWeight\n");
for (int i = 1; i < n; i++) {
printf("%d - %d \t%d\n", parent[i], i, graph[i][parent[i]]);
}
return 0;
}
```
其中,`graph`数组存储图的邻接矩阵,`parent`数组存储每个节点在最小生成树中的父节点,`key`数组存储每个节点到最小生成树的最小权值,`visited`数组存储每个节点是否已经加入最小生成树,`n`表示节点个数。在主函数中,首先读入图的邻接矩阵和节点个数,然后调用`prim`函数创建最小生成树,并输出最小生成树的边和权值。
阅读全文