Prim的算法的具体思路是从某个点开始用贪心的策略向外扩展,找到离当前生成树最近的节点加入树中,并用该节点更新生成树到其他节点的距离。显然复杂度O(n^2),而且有一个二倍的常数(一共扩展n次,每次找最近的点是O(n)的,用该点更新其它点在稠密图时也是O(n)的)。
然后某些大佬就想到可以用堆维护当前生成树到各个节点的距离,然而其实这并不会快多少。
首先我们假设是个稠密图(稀疏图尽量用kruskal),一共有n个节点要加入生成树中,每个节点加入时又要更新生成树到与之相连的点的距离,我们只是在找离生成树最近的节点时才用到了堆,所以理想复杂度为O(n*(n+logn)),其实也就是O(n^2)。然后我们考虑堆中并不是只有n个节点(因为一个点可以重复入堆多次),所以最坏情况下堆中可能有接近(n^2/2)个节点,再加上堆的常数,就一点优势都没有了。
总结,求最小生成树时稠密图用prim,且无需堆优化,稀疏图时能用kruskal就用,否则再考虑堆优化prim