最小生成树prim算法c语言代码
时间: 2024-12-19 08:12:47 浏览: 21
最小生成树算法之Prim算法
Prim's算法是一种用于求解带权无向图中最小生成树的经典算法。以下是使用C语言实现的简单版本,它采用邻接矩阵来表示图:
```c
#include <stdio.h>
#include <stdlib.h>
#define V 9 // 图的顶点数
// 边的数据结构
typedef struct {
int src, dest, weight;
} Edge;
// 检查是否存在边(u, v)且权重小于等于当前最小生成树的代价
int minDistance(int dist[], bool sptSet[]) {
int min = INT_MAX, u;
for (int v = 0; v < V; v++)
if (sptSet[v] == false && dist[u] <= min)
min = dist[u], u = v;
return u;
}
// Prim's algorithm
void primMST(int graph[V][V], int V) {
int dist[V];
bool sptSet[V]; // 存储最短路径树是否到达该节点
// 初始化距离数组
for (int i = 0; i < V; i++) {
dist[i] = graph[0][i];
sptSet[i] = false;
}
dist[0] = 0;
// 找到第一个顶点并将其加入SPT集合
sptSet[0] = true;
// 更新所有邻接顶点的距离
for (int count = 0; count < V - 1; count++) {
int u = minDistance(dist, sptSet);
printf("Adding edge %d-%d with weight %d\n", u, findMin(graph, u), graph[u][u]);
sptSet[u] = true; // 将找到的新顶点标记为已处理
// 更新未加入SPT的顶点到新顶点u的距离
for (int v = 0; v < V; v++)
if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
}
// 找出给定顶点u的所有邻居以及它们的权重
Edge findMin(int graph[V][V], int u) {
Edge minEdge = {u, -1, INT_MAX};
for (int v = 0; v < V; v++)
if (graph[u][v] && graph[u][v] < minEdge.weight)
minEdge.src = u, minEdge.dest = v, minEdge.weight = graph[u][v];
return minEdge;
}
int main() {
// 输入图的邻接矩阵
int graph[V][V] = {
// 图的邻接矩阵...
};
primMST(graph, V);
return 0;
}
```
这个程序首先初始化一个距离数组和一个标记数组,然后通过迭代过程不断选择未加入最小生成树的顶点中与其相连的最低代价边,更新距离数组。`findMin`函数用于找出某个顶点u的最小边。
阅读全文