构造可以使n个城市连接的最小生成树,c语言(最小生成树中包括的边及其权值,并显示得到的最小生成树的代价。)
时间: 2023-07-22 17:16:53 浏览: 76
可以使用 Prim 或 Kruskal 算法构造最小生成树,并输出包括的边及其权值以及最小生成树的代价。
以下是 Prim 算法的 C 语言实现代码(假设城市编号从 0 开始):
```c
#include <stdio.h>
#include <stdbool.h>
#include <limits.h>
#define MAXN 100 // 最大城市数量
int n; // 城市数量
int g[MAXN][MAXN]; // 城市之间的距离
bool visited[MAXN]; // 标记城市是否已经加入生成树
int parent[MAXN]; // 记录生成树中每个城市的父节点
int dist[MAXN]; // 记录生成树中每个城市到树的距离
int prim() {
// 初始化
for (int i = 0; i < n; i++) {
visited[i] = false;
parent[i] = -1;
dist[i] = INT_MAX;
}
dist[0] = 0;
int ans = 0;
// 重复 n 次,每次加入一个城市
for (int i = 0; i < n; i++) {
// 找到距离树最近的城市
int u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
visited[u] = true;
ans += dist[u];
// 输出加入的边和权值
if (parent[u] != -1) {
printf("%d -> %d : %d\n", parent[u], u, g[parent[u]][u]);
}
// 更新与 u 相邻的城市到树的距离
for (int v = 0; v < n; v++) {
if (!visited[v] && g[u][v] < dist[v]) {
dist[v] = g[u][v];
parent[v] = u;
}
}
}
return ans;
}
int main() {
// 输入城市数量和城市之间的距离
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &g[i][j]);
}
}
int ans = prim(); // 从第一个城市开始构造最小生成树
printf("Minimum Spanning Tree Cost: %d\n", ans);
return 0;
}
```
Kruskal 算法的实现代码类似,只需要改变加入城市的逻辑和输出边的方式即可。
阅读全文