用C++写一个程序实现采用克鲁斯卡尔算法求最小树
时间: 2023-08-04 14:24:21 浏览: 100
.编写实现克鲁斯卡尔算法的程序,求最小生成树。
4星 · 用户满意度95%
好的,下面是用C++实现克鲁斯卡尔算法求最小树的程序:
```cpp
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
// 定义边的结构体
struct Edge {
int from, to, weight;
Edge(int u, int v, int w) : from(u), to(v), weight(w) {}
};
// 定义并查集
class UnionFind {
public:
UnionFind(int n) {
count = n;
parent.resize(n);
for (int i = 0; i < n; ++i) {
parent[i] = i;
}
}
int find(int x) {
while (x != parent[x]) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
void unite(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) return;
parent[rootX] = rootY;
--count;
}
int getCount() const {
return count;
}
private:
int count;
vector<int> parent;
};
// 定义比较函数,用于将边按权值从小到大排序
bool cmp(const Edge& e1, const Edge& e2) {
return e1.weight < e2.weight;
}
vector<Edge> kruskal(int n, vector<Edge>& edges) {
vector<Edge> result;
UnionFind uf(n);
sort(edges.begin(), edges.end(), cmp);
for (const auto& edge : edges) {
if (uf.getCount() == 1) break;
int u = edge.from;
int v = edge.to;
if (uf.find(u) == uf.find(v)) continue;
uf.unite(u, v);
result.push_back(edge);
}
return result;
}
int main() {
int n, m;
cin >> n >> m;
vector<Edge> edges;
for (int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
edges.emplace_back(u, v, w);
}
vector<Edge> result = kruskal(n, edges);
for (const auto& edge : result) {
cout << edge.from << " " << edge.to << " " << edge.weight << endl;
}
return 0;
}
```
程序输入格式为:
```
n m
u1 v1 w1
u2 v2 w2
...
um vm wm
```
其中 n 表示节点个数,m 表示边的个数,后面 m 行每行表示一条边,每条边包含三个整数,分别表示起点、终点和权值。
程序输出最小树的边集,每行输出一条边,格式为:
```
from to weight
```
其中 from 和 to 表示边的起点和终点,weight 表示边的权值。
希望能够帮到你!
阅读全文