如何用c语言实现以无向网表示n个城市之间的通信网络计划,其中顶点表示城市,边上的权表示工程造价。请设计程序求出该通信网络总工程造价最低的建设方案
时间: 2024-02-05 20:13:49 浏览: 24
这是一个经典的最小生成树问题,可以使用Prim算法或Kruskal算法来求解。下面是使用Prim算法实现的示例代码:
```c
#include <stdio.h>
#include <limits.h>
#define MAX_N 100 // 最多城市数
#define INF INT_MAX // 无穷大
int n; // 城市数
int adj[MAX_N][MAX_N]; // 邻接矩阵表示的图
int visited[MAX_N]; // 是否已加入生成树
int dist[MAX_N]; // 从生成树到每个顶点的最小距离
int prim(int start) {
int i, j, min, min_index, sum_cost;
// 初始化
for (i = 0; i < n; i++) {
visited[i] = 0; // 初始状态都未被访问
dist[i] = adj[start][i]; // 初始距离为邻接矩阵中对应的权值
}
visited[start] = 1; // 将起点加入生成树
sum_cost = 0; // 总造价初始为0
// 重复n-1次,每次加入一个顶点到生成树中
for (i = 0; i < n - 1; i++) {
min = INF; // 找到距离生成树最近的顶点
for (j = 0; j < n; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
min_index = j;
}
}
visited[min_index] = 1; // 将其加入生成树
sum_cost += min; // 加入造价
// 更新新加入顶点的邻接顶点到生成树的距离
for (j = 0; j < n; j++) {
if (!visited[j] && adj[min_index][j] < dist[j]) {
dist[j] = adj[min_index][j];
}
}
}
return sum_cost;
}
int main() {
int i, j, cost;
// 输入城市数和邻接矩阵
printf("Enter the number of cities: ");
scanf("%d", &n);
printf("Enter the adjacency matrix:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &adj[i][j]);
if (adj[i][j] == 0) { // 如果两个城市之间没有边,将其距离设为无穷大
adj[i][j] = INF;
}
}
}
cost = prim(0); // 从第一个城市开始构建最小生成树
printf("The minimum cost of the communication network is %d.\n", cost);
return 0;
}
```
以上代码中,使用邻接矩阵表示图,`prim()`函数实现了Prim算法,`main()`函数输入城市数和邻接矩阵,并调用`prim()`函数求解最小生成树。