给定一个地区的n个城市间的距离网,构建通信网,计算最少代价。用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。
基本的设计要求如下(不限于此要求):
(1)城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。
(2)表示城市间距离网的邻接矩阵(要求至少6个城市,10条边)
(3)最小生成树中包括的边及其权值,并显示得到的最小生成树的代价。
帮你写好了,望采纳
#include <iostream>
#include <cstdio>
#include <cstring>
#include <climits>
using namespace std;
const int INF = INT_MAX;
// 设置无穷大值
const int N = 110;
// 城市数量
int n;
// 城市数量
int g[N][N];
// 邻接矩阵
bool st[N];
// 记录每个城市是否在最小生成树中
int prim() {
int ans = 0;
// 最小代价
memset(st, 0, sizeof st);
// 初始化所有城市都不在最小生成树中
st[1] = true;
// 从第 1 个城市开始构建最小生成树
for (int i = 1; i < n; i ++ ) {
int minc = INF;
// 最小边权
int p = -1;
// 记录最小边的另一个端点
for (int j = 1; j <= n; j ++ ) // 枚举每个点
if (!st[j]) // 如果这个点不在最小生成树中
for (int k = 1; k <= n; k ++ ) // 枚举这个点的每条边
if (st[k] && g[j][k] < minc) // 如果这条边的另一个端点在最小生成树中且权值更小 {
minc = g[j][k];
// 更新最小边权
p = j;
// 更新最小边的另一个端点
}
if (p == -1) return -1;
// 如果找不到最小边,说明原图不连通,返回 -1
st[p] = true;
// 将新的城市加入最小生成树
ans += minc;
// 更新最小代价
}
return ans;
// 返回最小代价
}
int main() {
cin >> n;
// 输入城市数量
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= n; j ++ )
cin >> g[i][j];
// 输入每条边的权值
int ans = prim();
// 计算最小生成树的代价
cout << "The minimum cost of the communication network is: " << ans << endl;
// 输出最小代价
cout << "The minimum spanning tree includes the following edges: " << endl;
for (int i = 2; i <= n; i ++ ) // 遍历每个点 {
for (int j = 1; j < i; j ++ ) // 遍历这个点的每条边
if (g[i][j] != INF) // 如果这条边存在 {
cout << i << "-" << j << ": " << g[i][j] << endl;
// 输出这条边
break;
// 找到了,跳出循环
}
}
return 0;
}