Cha*_*aos 1 c++ algorithm greedy kruskals-algorithm
我正在阅读wikipeida并发现Kruskal的Pseudocode如下:
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
Run Code Online (Sandbox Code Playgroud)
我不确定是什么FIND_SET()
,维基百科有以下描述:
如果该边连接两个不同的树,则将其添加到森林中,将两棵树组合成一棵树.
所以我想它会检查是否连接了两棵不同的树,但这究竟意味着什么呢?
最初,每个顶点都在一个集合中:{v}
每个顶点都有一个单独的集合v
.在伪代码中,这些集合是结果make_set(v)
.
对于给定的顶点v
,该函数find_set(v)
为您提供包含的集合v
.
该算法合并组反复,所以,如果{u}
,{v}
起初是单集和有边(u, v)
,则算法通过他们的工会代替了两套{u, v}
.现在,这两个find_set(u)
并find_set(v)
返回该集合.
在添加了|V| - 1
非平凡边之后,算法终止,这正是树中边的数量.