在图论中,Kruskal算法是一种用于求解最小生成树(Minimum Spanning Tree, MST)的经典算法。它适用于带权无向图,能够高效地找出连接所有顶点且总权重最小的边集合。本教程将手把手教你用C++语言实现Kruskal算法,即使你是编程小白,也能轻松理解!
Kruskal算法的核心思想是“贪心”:每次从所有未选的边中选择权重最小的一条,如果这条边不会与已选边构成环,就将其加入最小生成树中。重复此过程,直到选出 n-1 条边(n 为顶点数)为止。
为了高效判断是否形成环,Kruskal算法通常结合并查集(Union-Find)数据结构。这也是我们实现中的关键部分。

下面是一个完整的、可运行的C++实现,包含详细的注释:
// Kruskal算法 C++实现#include <iostream>#include <vector>#include <algorithm>using namespace std;// 定义边结构体struct Edge { int u, v, weight; // 用于排序的比较函数 bool operator<(const Edge& other) const { return weight < other.weight; }};// 并查集类class UnionFind {private: vector<int> parent; vector<int> rank;public: UnionFind(int n) { parent.resize(n); rank.resize(n, 0); for (int i = 0; i < n; ++i) { parent[i] = 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) { // 按秩合并 if (rank[rootX] < rank[rootY]) { parent[rootX] = rootY; } else if (rank[rootX] > rank[rootY]) { parent[rootY] = rootX; } else { parent[rootY] = rootX; rank[rootX]++; } } } bool connected(int x, int y) { return find(x) == find(y); }};// Kruskal算法主函数int kruskal(int n, vector<Edge>& edges) { sort(edges.begin(), edges.end()); // 按权重升序排序 UnionFind uf(n); int mstWeight = 0; int edgeCount = 0; for (const Edge& e : edges) { if (!uf.connected(e.u, e.v)) { uf.unite(e.u, e.v); mstWeight += e.weight; edgeCount++; cout << "选择边: (" << e.u << ", " << e.v << ") 权重: " << e.weight << endl; if (edgeCount == n - 1) break; } } return mstWeight;}// 主函数示例int main() { int n = 4; // 顶点数 vector<Edge> edges = { {0, 1, 10}, {0, 2, 6}, {0, 3, 5}, {1, 3, 15}, {2, 3, 4} }; cout << "Kruskal算法执行过程:\n"; int total = kruskal(n, edges); cout << "\n最小生成树总权重: " << total << endl; return 0;}
Kruskal算法的时间复杂度主要由排序决定,为 O(E log E),其中 E 是边的数量。并查集操作接近 O(α(V))(α 是反阿克曼函数,增长极慢),因此整体效率很高。
通过本教程,你已经掌握了如何用C++实现Kruskal算法来求解最小生成树。该算法结合并查集实现,是图论算法中的经典范例。建议你动手运行代码,修改输入数据,加深理解。掌握它,你就离精通算法又近了一步!
本文由主机测评网于2025-12-28发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251213483.html