#editing time : 2019/7/3 20:40
#file name : 最小生成樹prim演算法.py
from heapq import *
class node(object):
pass
class unionfindset(object):
def __init__(self,nodes):
self.fatherdict = {}
# key node value father 一層一層向上找
self.sizedict = {}
# key 節點 value 節點所在集合共有多少個節點
for node in nodes:
self.fatherdict[node]= node
self.sizedict[node] = 1
#每個節點的父親是自己 並且所在的集合為個數為1
#因為要少掛多 ,所以要找節點數目
def findhead(self,node):
stack =
father = self.fatherdict[node]
while father!=node:
node = father
father = self.fatherdict[node]
while stack:
self.fatherdict[stack.pop()] = father
return father
def issameset(self,a,b):
return self.findhead(a) == self.findhead(b)
def uion(self,a,b):
if a is none or b is none:
return
ahead = self.findhead(a)
bhead = self.findhead(b)
if ahead!=bhead:
asize = self.sizedict[ahead]
bsize = self.sizedict[bhead]
if asize<=bsize:
self.fatherdict[ahead] = bhead
self.sizedict[bhead] = asize+bsize
else:
self.fatherdict[bhead] = ahead
self.sizedict[ahead] = asize+bsize
class node(object):
def __init__(self,value=none):
self.value = value #節點的值
self.come = 0 #節點入度
self.out = 0 #節點出度
self.nexts = #節點的鄰居節點
self.edges = #在節點為from的情況下,邊的集合
class edge(object):
def __init__(self,weight=none,fro,to):
self.weight = weight # 邊的權重
self.fro = fro # 邊的from節點
self.to = to #邊的to節點
def __lt__(self, other):
return self.weight0:
tonode = edge.to
if tonode not in set1:
set1.add(tonode)
res1.add(edge)
for nextedge in tonode.edges:
return res1
最小生成樹(prim演算法)
最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...
最小生成樹 Prim演算法
prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...
最小生成樹 prim 演算法
一 演算法描述 假設存在連通帶權圖g v,e 其中最小生成樹為t,首先從圖中隨意選擇一點s屬於v作為起始點,並將其標記後加入集合u 中。然後演算法重複執行操作為在所有v屬於u,u屬於v u的邊 v0,u0 屬於e中找一條代價最小的邊並加入集合t,同時將u0併入u,直到u v為止。這是,t中必有n 1...