class MST: def __init__(self, G): self.marked = {} for vid in G.getVertexIds(): self.marked[vid] = False self.edges = [] self.pq = MinPQ() self.weight = 0 self.visit(G, 0) while not self.pq.isEmpty(): edge = self.pq.delMin() v = edge.either() w = edge.other(v) if self.marked[v] and self.marked[w]: continue if not self.marked[v]: self.visit(G, v) if not self.marked[w]: self.visit(G, w) self.edges.append(edge) self.weight += edge.getWeight() def visit(self, G, vid): self.marked[vid] = True edges = G.getAdjacentEdges(vid) for edge in edges: if not self.marked[edge.other(vid)]: self.pq.insert(edge) def getEdges(self): return self.edges def getWeight(self): return self.weight
def buildTrie(self, freq): pq = MinPQ() for i in range(0, self.R): if freq[i] > 0: pq.insert(Node(i, freq[i], None, None)) if pq.size() == 1: if freq['\0'] == 0: pq.insert(Node('\0', 0, None, None)) else: pq.insert(Node('\1', 0, None, None)) while pq.size() > 1: left = pq.delMin() right = pq.delMin() parent = Node('\0', left.freq + right.freq, left, right) pq.insert(parent) return pq.delMin()
class LazyPrimMST: def __init__(self, G): self.mst = [] self.pq = MinPQ() self.marked = [False] * G.Vertex() self.Weight = 0 for v in range(0, G.Vertex()): if not self.marked[v]: self.prim(G, v) #assert(self.check(G)) def prim(self, G, s): self.scan(G, s) while not self.pq.isEmpty(): e = self.pq.delMin() v = e.either() w = e.other(v) assert (self.marked[v] or self.marked[w]) if self.marked[v] and self.marked[w]: continue self.mst += [e] self.Weight += e.weight if not self.marked[v]: self.scan(G, v) if not self.marked[w]: self.scan(G, w) def scan(self, G, v): assert (not self.marked[v]) self.marked[v] = True for e in G.adj[v]: if not self.marked[e.other(v)]: self.pq.insert(e) def edges(self): return self.mst def weight(self): return self.Weight '''def check(self, G):