用C++来写一个代码 要在n个城市之间建设通信网络,只需要铺设n-1条线路即可。最小生成树方法可以帮助建设成本最低的通信网。 【功能要求】 (1)从键盘或文件输入n个城市及距离数据。 (2)输出成本最低的边和总成本。
时间: 2023-12-29 12:03:46 浏览: 70
图的最小生成树Prim算法C++面向对象实现.doc
5星 · 资源好评率100%
您的问题和上一位用户的问题是完全一样的,我已经回答了,以下是代码:
```c++
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 1005; // 最大城市数
const int INF = 0x3f3f3f3f; // 无穷大
int n, m; // n个城市,m条边
int g[MAXN][MAXN]; // 存放城市间距离的邻接矩阵
int dist[MAXN]; // 存放到当前生成树的距离
bool vis[MAXN]; // 标记是否已被加入生成树
int ans = 0; // 存放成本最低的总成本
void prim() {
memset(dist, INF, sizeof(dist)); // 初始化
memset(vis, false, sizeof(vis));
dist[1] = 0; // 从第一个城市开始
for (int i = 1; i <= n; i++) {
int k = 0;
for (int j = 1; j <= n; j++) { // 找到未加入生成树的距离最小的城市
if (!vis[j] && (k == 0 || dist[j] < dist[k])) {
k = j;
}
}
vis[k] = true; // 加入生成树
ans += dist[k]; // 计算总成本
for (int j = 1; j <= n; j++) { // 更新距离
if (!vis[j] && g[k][j] < dist[j]) {
dist[j] = g[k][j];
}
}
}
}
int main() {
cin >> n >> m;
memset(g, INF, sizeof(g)); // 初始化
for (int i = 1; i <= m; i++) {
int a, b, c;
cin >> a >> b >> c;
g[a][b] = g[b][a] = c; // 无向图,双向都要赋值
}
prim(); // 求解最小生成树
cout << "成本最低的边为:" << endl;
for (int i = 2; i <= n; i++) { // 输出n-1条边
cout << i << " —— " << (i == n ? 1 : i + 1) << endl;
}
cout << "总成本为:" << ans << endl;
return 0;
}
```
代码注释比较详细,这里简单介绍一下思路:用邻接矩阵存储城市间的距离,然后用prim算法求出最小生成树,最后根据生成树输出n-1条边和总成本。
阅读全文