用prim算法求给定无向连通网的最小生成树,输入无向连通网的顶点数,起始顶点及无向连通网各边的权值,输出各边和权值,C语言
时间: 2023-07-15 17:11:14 浏览: 102
用Prim算法求无向图的最小生成树.docx
以下是使用Prim算法求解给定无向连通网的最小生成树的C语言代码:
```
#include <stdio.h>
#include <stdbool.h>
#define MAXV 1000 // 最大顶点数
#define INF 0x3f3f3f3f // 无穷大
int N; // 顶点数
int start; // 起始顶点
int graph[MAXV][MAXV]; // 无向连通网
int dist[MAXV]; // 记录当前顶点到树的距离
bool visited[MAXV]; // 标记顶点是否已被加入树
void Prim() {
// 初始化
for (int i = 1; i <= N; i++) {
dist[i] = INF;
visited[i] = false;
}
dist[start] = 0;
// 循环n次,每次将一个顶点加入树中
for (int i = 1; i <= N; i++) {
int v = -1; // 当前距离树最近的顶点
// 找到当前距离树最近的顶点
for (int j = 1; j <= N; j++) {
if (!visited[j] && (v == -1 || dist[j] < dist[v])) {
v = j;
}
}
visited[v] = true;
// 更新其它顶点到树的距离
for (int j = 1; j <= N; j++) {
if (!visited[j] && graph[v][j] < dist[j]) {
dist[j] = graph[v][j];
}
}
}
}
int main() {
// 输入无向连通网的顶点数,起始顶点及无向连通网各边的权值
scanf("%d%d", &N, &start);
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
scanf("%d", &graph[i][j]);
}
}
// 使用Prim算法求解最小生成树
Prim();
// 输出最小生成树的各边和权值
int sum = 0;
for (int i = 1; i <= N; i++) {
if (dist[i] != INF) {
sum += dist[i];
}
}
printf("最小生成树的权值为:%d\n", sum);
return 0;
}
```
在这个代码中,我们使用了一个dist数组来记录每一个顶点到树的距离,使用一个visited数组来标记每个顶点是否已经加入树中。在每次循环中,找到距离树最近的顶点v,将其加入树中,并更新其它顶点到树的距离。最后输出所有顶点到树的距离之和,即为最小生成树的权值。
阅读全文