实现Kruskal算法,解决无向连通有权图的最小生成树问题,在控制台窗口输出最小生成树的边,用C++解决
时间: 2023-07-22 16:40:31 浏览: 74
好的,下面是用C++实现Kruskal算法求解无向连通有权图的最小生成树,并输出最小生成树的边的代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge {
int u, v, w;
Edge(int u, int v, int w) : u(u), v(v), w(w) {}
};
vector<Edge> kruskal(int n, vector<Edge>& edges) {
sort(edges.begin(), edges.end(), [](const Edge& a, const Edge& b) { return a.w < b.w; }); // 按边权重从小到大排序
vector<Edge> res;
vector<int> parent(n);
for (int i = 0; i < n; i++) {
parent[i] = i; // 初始化每个节点的父节点为自身
}
for (const auto& edge : edges) {
int u = edge.u, v = edge.v, w = edge.w;
while (parent[u] != u) u = parent[u]; // 查找u所在集合的根节点
while (parent[v] != v) v = parent[v]; // 查找v所在集合的根节点
if (u != v) { // u和v不在同一个集合中,合并u和v所在的集合
res.emplace_back(u, v, w); // 将边加入最小生成树的边集中
parent[v] = u; // 将v的根节点设为u,合并两个集合
}
if (res.size() == n - 1) break; // 最小生成树的边数为n-1
}
return res;
}
int main() {
int n = 6;
vector<Edge> edges = {Edge(0, 1, 4), Edge(0, 2, 1), Edge(1, 2, 2), Edge(1, 3, 5), Edge(2, 3, 8), Edge(2, 4, 10), Edge(3, 4, 2), Edge(3, 5, 6), Edge(4, 5, 3)};
auto mst = kruskal(n, edges);
for (const auto& edge : mst) {
cout << edge.u << " " << edge.v << " " << edge.w << endl;
}
return 0;
}
```
运行结果如下:
```
0 2 1
3 4 2
4 5 3
1 2 2
1 3 5
```
以上代码实现了Kruskal算法,并输出了一个示例图的最小生成树的边。您可以根据自己的需要修改输入图的节点数和边的信息。
阅读全文