读入一个无向图的邻接矩阵(即数组表示),建立无向图并采用Prim算法写一个最小生成树C语言代码,输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。 以后的n行中每行有n个用空格隔开的整数,对于第i行的第j个整数,如果不为0,则表示第i个顶点和第j个顶点有直接连接且代价为相应的值,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。 输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图,且保证图中只有一个连通分量。输出只有一个整数,即最小生成树的总代价。请注意行尾输出换行。
时间: 2023-12-10 21:38:58 浏览: 111
Prim算法计算最小生成树(无向图&邻接矩阵)_算法_数据结构_
5星 · 资源好评率100%
以下是采用Prim算法的最小生成树C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 50
#define INF 0x3f3f3f3f
int graph[MAX_N][MAX_N]; //邻接矩阵表示的无向图
int visited[MAX_N]; //标记是否在最小生成树中
int d[MAX_N]; //每个节点到最小生成树的距离
int prim(int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
visited[i] = 0;
d[i] = graph[0][i]; //初始化为0节点到其他节点的距离
}
visited[0] = 1;
for (int i = 1; i < n; i++) {
int u = -1, min_d = INF;
//找到离最小生成树最近的节点
for (int j = 0; j < n; j++) {
if (!visited[j] && d[j] < min_d) {
u = j;
min_d = d[j];
}
}
visited[u] = 1;
sum += min_d;
//更新其他节点到最小生成树的距离
for (int v = 0; v < n; v++) {
if (!visited[v] && graph[u][v] < d[v]) {
d[v] = graph[u][v];
}
}
}
return sum;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &graph[i][j]);
}
}
int min_cost = prim(n);
printf("%d\n", min_cost);
return 0;
}
```
算法思路:
1. 初始化最小生成树为空,将0节点加入最小生成树中;
2. 对于每个不在最小生成树中的节点,计算它到最小生成树的距离,选择距离最小的节点加入最小生成树中;
3. 更新其他节点到最小生成树的距离,重复步骤2,直到所有节点都加入最小生成树中。
时间复杂度为 O(n^2),适用于较小规模的图。
阅读全文