C++ 语言 实现 Kruskal 最小生成树

C++阿木 发布于 4 天前 1 次阅读


阿木博主一句话概括:C++实现Kruskal最小生成树算法详解

阿木博主为你简单介绍:最小生成树(Minimum Spanning Tree,MST)是图论中的一个重要概念,它能够以最少的边连接图中的所有顶点。Kruskal算法是求解最小生成树的一种经典算法,本文将围绕Kruskal算法,使用C++语言实现,并对其原理、步骤和代码实现进行详细解析。

一、Kruskal算法原理

Kruskal算法的基本思想是:按照边的权重从小到大排序,依次将边加入最小生成树中,同时保证不形成环。具体步骤如下:

1. 将所有边按照权重从小到大排序;
2. 初始化一个空的最小生成树T;
3. 遍历排序后的边,对于每条边:
a. 检查这条边是否与T中的顶点形成环;
b. 如果不形成环,将这条边加入T中;
4. 重复步骤3,直到T中包含所有顶点。

二、C++实现Kruskal算法

下面是使用C++实现Kruskal算法的代码示例:

cpp
include
include
include

using namespace std;

// 边的结构体
struct Edge {
int src, dest, weight;
};

// 比较函数,用于排序
bool compare(const Edge& a, const Edge& b) {
return a.weight < b.weight;
}

// 并查集的根节点
int find(int parent[], int i) {
if (parent[i] == i)
return i;
return find(parent, parent[i]);
}

// 合并两个集合
void unionSet(int parent[], int rank[], int x, int y) {
int xroot = find(parent, x);
int yroot = find(parent, y);

if (rank[xroot] rank[yroot])
parent[yroot] = xroot;
else {
parent[yroot] = xroot;
rank[xroot]++;
}
}

// Kruskal算法实现
void kruskalMST(vector& edges, int V, int E) {
vector result;
sort(edges.begin(), edges.end(), compare);

int i = 0; // 边的索引
int e = 0; // 已选择的边数
int parent[V];
int rank[V];

// 初始化并查集
for (int v = 0; v < V; ++v) {
parent[v] = v;
rank[v] = 0;
}

// 遍历所有边
while (e < V - 1 && i < E) {
// 获取当前边
Edge current = edges[i++];

// 检查当前边是否与T中的顶点形成环
int x = find(parent, current.src);
int y = find(parent, current.dest);

// 如果不形成环,将当前边加入T中
if (x != y) {
result.push_back(current);
e++;
unionSet(parent, rank, x, y);
}
}

// 打印最小生成树
for (int i = 0; i < result.size(); ++i) {
cout << result[i].src << " - " << result[i].dest << " = " << result[i].weight << endl;
}
}

int main() {
int V = 5; // 顶点数
int E = 7; // 边数
vector edges = {
{0, 1, 10}, {0, 2, 6}, {0, 3, 5}, {1, 3, 15}, {2, 3, 4},
{2, 4, 9}, {3, 4, 20}
};

kruskalMST(edges, V, E);

return 0;
}

三、总结

本文详细介绍了Kruskal算法的原理和C++实现。通过使用并查集数据结构,Kruskal算法能够有效地求解最小生成树。在实际应用中,Kruskal算法常用于网络设计、电路设计等领域。希望本文对您有所帮助。