Пример #1
0
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
Пример #2
0
    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()
Пример #3
0
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):