c++ - 克鲁斯卡尔算法解释

标签 c++ algorithm greedy kruskals-algorithm

我正在阅读维基百科,发现 Kruskal 的伪代码如下:

KRUSKAL(G):    
    foreach v ∈ G.V:    
        MAKE_SET(v)    
    G.E = sort(G.E)    
    i = 0    
    while (i != |V|-1):      
        pick the next (u, v) edge from sorted list of edges G.E        
        if (FIND_SET(u) != FIND_SET(v)):          
            UNION(u, v)        
            i = i + 1 

我不太确定 FIND_SET() 做了什么,维基百科有以下描述:

if that edge connects two different trees, then add it to the forest, combining two trees into a single tree.

所以我猜它会检查两棵不同的树是否相连,但这到底是什么意思?

最佳答案

最初,每个顶点都在一个集合中:每个顶点 v 都有一个单独的集合 {v}。在伪代码中,这些集合是 make_set(v) 的结果。

对于给定的顶点 v,函数 find_set(v) 为您提供包含 v 的集合。

该算法迭代地合并集合,因此如果 {u}{v} 最初是单例集并且存在边 (u, v),然后算法用它们的并集 {u, v} 替换这两个集合。现在 find_set(u)find_set(v) 都将返回该集合。

算法在您添加 |V| 后终止- 1 non-trivial edges,也就是一棵树的边数。

关于c++ - 克鲁斯卡尔算法解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13654613/

相关文章:

algorithm - 刺一个区间的最小点集

c++ - 正确实例化双重继承的对象?

c++ - Xcode 警告 : "directory not found for option"

algorithm - Haskell 中 3 个实现的最高产品

c++ - 随机化字符数组以显示随 secret 码

algorithm - 用大数求大数的模

regex - 贪心 block ()* 包含通配符

c++ - 是否可以在运行时重载函数?

C++ SFML 成员初始值设定项

c# - 如何在 .net 中加密文件并在 android 中解密