#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 边结构体,包含起点、终点和权重
struct Edge {
int u, v, w;
bool operator<(const Edge& other) const {
return w < other.w;
}
};
// 并查集类
class UnionFind {
private:
vector<int> parent;
public:
UnionFind(int size) {
for (int i = 0; i < size; i++) {
parent.push_back(i);
}
}
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]); // 路径压缩
}
return parent[x];
}
void unite(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent[rootX] = rootY;
}
}
};
// Kruskal算法实现
int kruskal(int V, vector<Edge>& edges) {
sort(edges.begin(), edges.end()); // 按权重排序
UnionFind uf(V);
int mstWeight = 0; // 最小生成树的权重
int e = 0; // 边数
for (Edge& edge : edges) {
int u = uf.find(edge.u);
int v = uf.find(edge.v);
if (u != v) { // 确保这条边不会形成环
uf.unite(u, v);
mstWeight += edge.w;
e++;
if (e == V - 1) break; // 最小生成树有V-1条边
}
}
if (e != V - 1) {
// 如果边数不足V-1,说明图不连通
return -1;
}
return mstWeight;
}
int main() {
int V = 4; // 顶点数
vector<Edge> edges = {{0, 1, 10}, {0, 2, 6}, {0, 3, 5},
{1, 3, 15}, {2, 3, 4}};
int mstWeight = kruskal(V, edges);
if (mstWeight == -1) {
cout << "Graph is not connected" << endl;
} else {
cout << "Weight of MST is " << mstWeight << endl;
}
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
c++实现最小生成树.zip (1个子文件)
c++实现最小生成树
c++实现最小生成树.cpp 2KB
共 1 条
- 1
资源评论
早七睡不醒
- 粉丝: 0
- 资源: 158
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功