c++编程 假设带权连通图G有n个顶点,用邻接矩阵A[n][n]表示存储结构,u为指定顶点的序号。试设计Prim算法,用于从顶点u出发构造连通图G的最小生成树。
时间: 2024-06-14 11:03:24 浏览: 153
以下是C++编程实现Prim算法构造连通图最小生成树的过程:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_SIZE = 100;
const int MAX_INT = 326564;
int n; // 顶点数
int A[MAX_SIZE][MAX_SIZE]; // 邻接矩阵
int lowcost[MAX_SIZE]; // 存储当前生成树到各个顶点的最小边权值
int closest[MAX_SIZE]; // 存储当前生成树到各个顶点的最小边的起点
void Prim(int u) {
memset(lowcost, MAX_INT, sizeof(lowcost)); // 初始化lowcost数组
memset(closest, -1, sizeof(closest)); // 初始化closest数组
lowcost[u] = 0; // 从指定顶点u开始构造最小生成树
for (int i = 1; i < n; i++) { // 构造n-1条边
int k = -1;
int min = MAX_INT;
for (int j = 0; j < n; j++) { // 找到当前生成树到各个顶点的最小边
if (lowcost[j] != 0 && lowcost[j] < min) {
k = j;
min = lowcost[j];
}
}
if (k != -1) { // 将找到的最小边加入生成树
lowcost[k] = 0;
for (int j = 0; j < n; j++) { // 更新当前生成树到各个顶点的最小边
if (lowcost[j] != 0 && A[k][j] < lowcost[j]) {
lowcost[j] = A[k][j];
closest[j] = k;
}
}
}
}
}
int main() {
int m; // 边数
cin >> n >> m;
memset(A, MAX_INT, sizeof(A)); // 初始化邻接矩阵
for (int i = 0; i < m; i++) { // 读入边的信息
int x, y, w;
cin >> x >> y >> w;
A[x][y] = w;
A[y][x] = w;
}
int u;
cin >> u; // 指定起点
Prim(u); // 构造最小生成树
int sum = 0;
for (int i = 0; i < n; i++) { // 计算最小生成树的权值之和
if (closest[i] != -1) {
sum += A[i][closest[i]];
}
}
cout << sum << endl;
return 0;
}
```
阅读全文