我知道Prim的算法以及如何实现它。我也知道为什么其时间复杂度为O(E + V log(V))。
我们加上边E次(即O(E)),并选择最小的V次(即O(V * log(V))。但是我不明白其中的一部分:为什么选择V次? !我知道一棵树有V-1条边,但是如果最重的边必须在MST中,我们必须选择最小的E次,而不是V次。
例如:一个完整的图形,每个边的权重为1,除了一个顶点,所有与之相连的边的权重为10 ^ 18。
答案 0 :(得分:2)
您要使用初始图形中的边连接V顶点,从而生成一棵树。您可以从任何节点开始,比方说v。然后,将连接v的边的成本从v可以到达的所有顶点添加到队列中。您去了最便宜的一个。现在您做同样的事情。如果要放入队列中已经存在的顶点u,则必须检查边缘的工资。如果新的较小,则取出较旧的,然后插入较新的,否则跳过。另外,如果您已经将节点u连接到树上,则也将其跳过。因此队列中最多有V个顶点,时间复杂度为O(E + V log V)(E-因为您必须检查每个顶点的所有边)
编辑:更具体地说,当您将顶点u再次添加到队列中时,您可以擦除上一个顶点,或仅更改其成本。如果使用斐波那契堆,另一件事应该更快。删除将花费O(E log V)而不是O(E + VlogV)