C++中的Boruvka算法用于最小生成树

2023年 8月 29日 63.4k 0

C++中的Boruvka算法用于最小生成树

在图论中,寻找连通加权图的最小生成树(MST)是一个常见的问题。MST是图的边的子集,它连接了所有的顶点并最小化了总边权。解决这个问题的一种高效算法是Boruvka算法。

语法

struct Edge {
int src, dest, weight;
};

// Define the structure to represent a subset for union-find
struct Subset {
int parent, rank;
};

登录后复制

算法

现在,让我们概述Boruvka算法中涉及的寻找最小生成树的步骤−

  • 将 MST 初始化为空集。

  • 为每个顶点创建一个子集,其中每个子集只包含一个顶点。

  • 重复以下步骤,直到最小生成树(MST)有V-1条边(V是图中顶点的数量)−

    • 对于每个子集,找到将其连接到另一个子集的最便宜的边。

    • 将选定的边添加到最小生成树中。

    • 对所选边的子集执行并集操作。

  • 输出最小生成树。

方法

在Boruvka算法中,有多种方法可以找到连接每个子集的最便宜的边。以下是两种常见的方法−

方法一:朴素方法

对于每个子集,遍历所有边,并找到将其连接到另一个子集的最小边。

跟踪选定的边并执行联合操作。

示例

#include
#include
#include

struct Edge {
int src, dest, weight;
};

// Define the structure to represent a subset for union-find
struct Subset {
int parent, rank;
};

// Function to find the subset of an element using path compression
int find(Subset subsets[], int i) {
if (subsets[i].parent != i)
subsets[i].parent = find(subsets, subsets[i].parent);
return subsets[i].parent;
}

// Function to perform union of two subsets using union by rank
void unionSets(Subset subsets[], int x, int y) {
int xroot = find(subsets, x);
int yroot = find(subsets, y);
if (subsets[xroot].rank subsets[yroot].rank)
subsets[yroot].parent = xroot;
else {
subsets[yroot].parent = xroot;
subsets[xroot].rank++;
}
}

// Function to find the minimum spanning tree using Boruvka's algorithm
void boruvkaMST(std::vector& edges, int V) {
std::vector selectedEdges; // Stores the edges of the MST

Subset* subsets = new Subset[V];
int* cheapest = new int[V];

// Initialize subsets and cheapest arrays
for (int v = 0; v 1) {
for (int i = 0; i edges[i].weight)
cheapest[set1] = i;
if (cheapest[set2] == -1 || edges[cheapest[set2]].weight > edges[i].weight)
cheapest[set2] = i;
}
}

for (int v = 0; v < V; v++) {
if (cheapest[v] != -1) {
int set1 = find(subsets, edges[cheapest[v]].src);
int set2 = find(subsets, edges[cheapest[v]].dest);

if (set1 != set2) {
selectedEdges.push_back(edges[cheapest[v]]);
MSTWeight += edges[cheapest[v]].weight;
unionSets(subsets, set1, set2);
numTrees--;
}

cheapest[v] = -1;
}
}
}

// Output the MST weight and edges
std::cout

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论