用c语言实现最小生成树并给出代码
时间: 2024-04-08 17:32:52 浏览: 74
以下是使用C语言实现最小生成树的代码示例,使用Prim算法:
```c
#include <stdio.h>
#include <stdbool.h>
#include <limits.h>
// 定义图的最大节点数量
#define MAX_NODES 100
// 定义无穷大的权值,表示两个节点之间没有边相连
#define INF INT_MAX
// 图的邻接矩阵表示
int graph[MAX_NODES][MAX_NODES];
// 最小生成树的结果存储数组
int mst[MAX_NODES];
// 记录节点是否被访问过
bool visited[MAX_NODES];
// 顶点数量和边数量
int numNodes, numEdges;
// Prim算法求解最小生成树
void primMST() {
// 初始化
for (int i = 0; i < numNodes; i++) {
visited[i] = false;
mst[i] = INF;
}
// 第一个顶点作为起始节点
mst[0] = 0;
// 遍历所有顶点
for (int count = 0; count < numNodes - 1; count++) {
// 找到距离当前最小生成树最近的节点
int minNode, minWeight = INF;
for (int v = 0; v < numNodes; v++) {
if (!visited[v] && mst[v] < minWeight) {
minNode = v;
minWeight = mst[v];
}
}
// 将节点标记为已访问
visited[minNode] = true;
// 更新与新加入节点相邻的节点的最小权值
for (int v = 0; v < numNodes; v++) {
if (graph[minNode][v] && !visited[v] && graph[minNode][v] < mst[v]) {
mst[v] = graph[minNode][v];
}
}
}
}
// 打印最小生成树
void printMST() {
printf("Edge \tWeight\n");
for (int i = 1; i < numNodes; i++) {
printf("%d - %d \t%d\n", mst[i], i, graph[i][mst[i]]);
}
}
int main() {
// 输入顶点数量和边数量
printf("Enter the number of nodes: ");
scanf("%d", &numNodes);
printf("Enter the number of edges: ");
scanf("%d", &numEdges);
// 初始化图的邻接矩阵
for (int i = 0; i < numNodes; i++) {
for (int j = 0; j < numNodes; j++) {
graph[i][j] = 0;
}
}
// 输入边的信息
printf("Enter the edges (node1 node2 weight):\n");
for (int i = 0; i < numEdges; i++) {
int node1, node2, weight;
scanf("%d %d %d", &node1, &node2, &weight);
graph[node1][node2] = weight;
graph[node2][node1] = weight;
}
// 求解最小生成树
primMST();
// 打印最小生成树
printMST();
return 0;
}
```
请注意,这只是一个基本的实现示例,可能需要根据具体需求进行调整和优化。
阅读全文