c语言最小生成树邻接矩阵求权
时间: 2023-12-12 14:35:56 浏览: 93
以下是使用C语言求解最小生成树邻接矩阵权的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 100
#define INF INT_MAX
int n; // 图中节点数
int adj[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
int selected[MAX_VERTICES]; // 已选择的节点
int dist[MAX_VERTICES]; // 节点到最小生成树的距离
// Prim算法求解最小生成树
void prim(int start) {
int i, j, u, v, min;
// 初始化
for (i = 0; i < n; i++) {
dist[i] = adj[start][i];
selected[i] = 0;
}
selected[start] = 1;
// 选择n-1个节点
for (i = 0; i < n - 1; i++) {
min = INF;
u = -1;
// 选择距离最小的节点
for (j = 0; j < n; j++) {
if (!selected[j] && dist[j] < min) {
min = dist[j];
u = j;
}
}
selected[u] = 1;
// 更新距离
for (v = 0; v < n; v++) {
if (!selected[v] && adj[u][v] < dist[v]) {
dist[v] = adj[u][v]; }
}
}
}
int main() {
int i, j, start, sum = 0;
// 读入节点数和邻接矩阵
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &adj[i][j]);
}
}
// 选择起始节点
printf("请输入起始节点:");
scanf("%d", &start);
// 求解最小生成树
prim(start);
// 计算最小代价
for (i = 0; i < n; i++) {
if (dist[i] != INF) {
sum += dist[i];
}
}
printf("最小生成树的代价为:%d\n", sum);
return 0;
}
```
阅读全文