在C语言或C++中利用Prim算法或者克鲁斯卡尔算法,求解无向图的最小生成树,输出最小生成树。在主函数main( )中进行测试验证。
时间: 2024-03-24 13:35:56 浏览: 91
最小生成树有很多种生成方法,主要有普利姆算法和克鲁斯卡尔算法,通过C语言easyx图形库实现
5星 · 资源好评率100%
好的,这是一个很经典的算法问题。我可以给您提供一个C++实现的Prim算法来解决这个问题。
在这个实现中,我们假设输入的无向图用邻接矩阵表示,其中graph[i][j]表示第i个节点到第j个节点的边的权重(如果没有边,则为无穷大)。
代码如下:
```cpp
#include <iostream>
#include <climits>
using namespace std;
// 定义一个常量表示无穷大
const int INF = INT_MAX;
int main() {
int n; // 节点数
cin >> n;
// 初始化邻接矩阵
int graph[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> graph[i][j];
if (graph[i][j] == 0) {
graph[i][j] = INF;
}
}
}
// 初始化Prim算法需要用到的变量
int parent[n]; // 用于存储每个节点在最小生成树中的父节点
int key[n]; // 用于存储每个节点到最小生成树的距离
bool inMST[n]; // 用于存储每个节点是否已经在最小生成树中
for (int i = 0; i < n; i++) {
key[i] = INF;
inMST[i] = false;
}
// 从第0个节点开始构建最小生成树
key[0] = 0;
parent[0] = -1;
for (int i = 0; i < n - 1; i++) {
// 找到距离最小的节点
int min_key = INF, min_index = -1;
for (int j = 0; j < n; j++) {
if (!inMST[j] && key[j] < min_key) {
min_key = key[j];
min_index = j;
}
}
// 将该节点加入最小生成树
inMST[min_index] = true;
// 更新其他节点到最小生成树的距离
for (int j = 0; j < n; j++) {
if (graph[min_index][j] != INF && !inMST[j] && graph[min_index][j] < key[j]) {
key[j] = graph[min_index][j];
parent[j] = min_index;
}
}
}
// 输出最小生成树
for (int i = 1; i < n; i++) {
cout << parent[i] << " - " << i << " : " << graph[i][parent[i]] << endl;
}
return 0;
}
```
在这个实现中,我们使用一个数组`inMST`来标记每个节点是否已经在最小生成树中。每次找到距离最小的节点`min_index`,将其加入最小生成树中,并更新其他节点到最小生成树的距离。最后输出最小生成树。
您可以输入一个类似下面的邻接矩阵来测试这个程序:
```
5
0 2 0 6 0
2 0 3 8 5
0 3 0 0 7
6 8 0 0 9
0 5 7 9 0
```
这个邻接矩阵表示一个有5个节点的无向图,其中边的权重分别为2、3、6、5、7、8、9。程序的输出应该是:
```
0 - 1 : 2
1 - 2 : 3
0 - 3 : 6
1 - 4 : 5
```
阅读全文