class LazyPrimMST:
    def __init__(self, ewg):
        #ewg is an edge weighted graph
        self.pq = MinPQ()
        self.marked = [False] * (ewg.v + 1)
        self.mst = Queue()

        self._visit(ewg, 0)

        while not self.pq.isEmpty():
            e = self.pq.dequeue()
            v = e.either()
            w = e.other(v)
            if (self.marked[v] == True and self.marked[w] == True):
                continue
            self.mst.enqueue(e)
            if not self.marked[v] == True:
                self._visit(ewg, v)
            if not self.marked[w] == True:
                self._visit(ewg, w)

    def _visit(self, ewg, v):
        self.marked[v] = True
        for e in ewg.adj(v):
            if not self.marked[e.other(v)] == True:
                self.pq.enqueue(e)

    def edges(self):
        return self.mst
class LazyPrimMST:

	def __init__(self,ewg):
		#ewg is an edge weighted graph
		self.pq = MinPQ()
		self.marked = [False] * (ewg.v+1)
		self.mst = Queue()

		self._visit(ewg,0)

		while not self.pq.isEmpty():
			e = self.pq.dequeue()
			v = e.either()
			w = e.other(v)
			if (self.marked[v] == True and self.marked[w] == True):
				continue 
			self.mst.enqueue(e)
			if not self.marked[v] == True:
				self._visit(ewg,v)
			if not self.marked[w] == True :
				self._visit(ewg,w)



	def _visit(self,ewg,v):
		self.marked[v] = True
		for e in ewg.adj(v):
			if not self.marked[e.other(v)] == True :
				self.pq.enqueue(e)

	def edges(self):
		return self.mst
Пример #3
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
Пример #4
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):
class KruskalMST:
	def __init__(self,ewg):
		self._mst = Queue()
		self._pq = MinPQ(ewg.edges())
		self._uf = UnionFind(ewg.v+1)

		while not self._pq.isEmpty() and self._mst.size < ewg.v-1:
			#get minimum weighted ege on the PQ
			e = self._pq.dequeue()
			#get the first vertex
			v = e.either()
			#get the second 
			w = e.other(v)

			if (self._uf.connected(v,w)):
				continue 
			self._uf.union(v,w)
			self._mst.enqueue(e)

	def edges(self):
		return self._mst