用C语言某地对偏远地区实行“村村通”工程,目标是使整个地区任何两个村落间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到拟修建道路的费用,现请你编写程序,计算出全地区畅通需要的最低成本。输入格式:输入的第一行给出村庄数目N (1≤N≤20)和拟修建的道路数M接下来的M行对应修建每条村庄间道路的成本,每行给出3个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本。输出格式:输出需修建的道路,按prim算法从编号1开始得到的顺序,输出每条路,每行输出一条道路,形式如:道路1编号,道路2编号,费用。(编号小的放前面,编号大的放后面,逗号为英文状态下的逗号)输入样例:4 61 2 11 3 41 4 12 3 32 4 23 4 5输出样例:1,2,11,4,1
时间: 2024-02-29 09:52:20 浏览: 258
以下是使用 C 语言实现的 Prim 算法代码:
```c
#include <stdio.h>
#include <stdbool.h>
#include <limits.h>
#define MAXN 20
int cost[MAXN + 1][MAXN + 1]; // 村庄之间修建道路的成本
bool visited[MAXN + 1]; // 当前村庄是否已经访问过
int dist[MAXN + 1]; // 从村庄 1 到各个村庄的最短距离
int parent[MAXN + 1]; // 当前村庄在最小生成树中的父节点
int main() {
int N, M;
scanf("%d %d", &N, &M);
// 初始化 cost 数组
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cost[i][j] = INT_MAX;
}
}
// 读入修建道路的成本
for (int i = 1; i <= M; i++) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
cost[a][b] = cost[b][a] = c;
}
// 初始化 visited、dist 和 parent 数组
for (int i = 1; i <= N; i++) {
visited[i] = false;
dist[i] = INT_MAX;
parent[i] = -1;
}
visited[1] = true;
dist[1] = 0;
// 使用 Prim 算法求解最小生成树
while (true) {
int v = -1;
for (int i = 1; i <= N; i++) {
if (!visited[i] && (v == -1 || dist[i] < dist[v])) {
v = i;
}
}
if (v == -1) {
break;
}
visited[v] = true;
for (int i = 1; i <= N; i++) {
if (!visited[i] && cost[v][i] < dist[i]) {
dist[i] = cost[v][i];
parent[i] = v;
}
}
}
// 输出最小生成树的边
for (int i = 2; i <= N; i++) {
if (parent[i] != -1) {
printf("%d,%d,%d\n", (i < parent[i] ? i : parent[i]), (i < parent[i] ? parent[i] : i), cost[i][parent[i]]);
}
}
return 0;
}
```
代码中的核心部分是 Prim 算法求解最小生成树,最后遍历最小生成树的边并输出即可。
阅读全文