prim 算法和kruskal都属于贪婪算法,其中prim算法更接近图的广度优先遍历,取一个点,找能选的权值最小的边;而kruskal则是把边按照从小到大排,如果新加的边的两个端点都被遍历过,就需要检查这两个点是否已经在一个连通通路里面。


python的练习代码

#!/usr/bin/env python
import sys,cPickle
from random import choice
from heap import MinHeap as mpq
class Vertex(object):
    def __init__(self,value=None):
        self.value=value
    def __str__(self):
        return str(self.value)
    def __repr__(self):
        return str(self.value)
class Edge(object):
    def __init__(self,weight=None,v1=None,v2=None):
        self.weight=weight
        self.v1=v1
        self.v2=v2
    def __str__(self):
        return str((self.v1,self.v2))+'-->%d'%self.weight
    def __repr__(self):
        return str((self.v1,self.v2))+'-->%d'%self.weight
    def __cmp__(self,value):
        if self.weight 
  


prim算法里的最小优先级队列算法就用我刚做的,实际上python已经有了heapq的封装。纯粹当练习了。算法导论里面提到可以用fibonacci堆将二叉堆做优化,可以把prim 算法的复杂度从O(ElgV)降低到O(E+VlgV),这个以后再研究吧