没时间作解释了,下次写python
# coding=utf8 G = [ {5: 10, 1: 28}, # 0 {0: 28, 6: 14, 2: 16}, # 1 {1: 16, 3: 12}, # 2 {2: 12, 4: 22, 6: 18}, # 3 {3: 22, 5: 25, 6: 24}, # 4 {0: 10, 4: 25}, # 5 {1: 14, 3: 18, 4: 24} # 6 ] import heapq def prim(G): # 这个图的顶点个数,prim算法的边数就是顶点数减一 n = len(G) # 从第一个顶点开始 v = 0 # 这个集合避免重复的顶点被重复执行,形成无限循环 s = {v} # 存放边的值 edges = [] # 存放结果 res = [] for _ in range(n - 1): # 对字典进行解包 for u, w in G[v].iteritems(): # hwapq优先级队列回自动弹出最小值,默认以元祖中第一个元素排序 # 因此第一个参数w表明权值,v,u表示两个顶点 heapq.heappush(edges, (w, v, u)) # 循环条件,只有当咱们的边存在才会进行循环 while edges: # 对优先级队列中的边进行拆包,拿出权值最小的那个边 w, p, q = heapq.heappop(edges) # 在咱们计算顶点的时候,要求顶点不全在咱们的集合中,因为边的第一个顶点已经固定在集合中了 # 所以只须要要求第二个顶点不能在集合中 if q not in s: # 访问一个顶点,就把这个顶点放进集合中 s.add(q) # 把最小的边加入到咱们的结果中 res.append(((p, q), w)) # 把下一个顶点做为起始顶点 v = q # 而后推出这一次的顶点,操做下一个顶点 break return res print prim(G)