示例#1
0
    def dijkstra(
        self, valor_vertice_origem
    ) -> (Dict[Vertice, DistanciaVerticeOrigem], Dict[Vertice, Vertice]):
        distancia = {}
        pai = {}
        vertice_origem = self.obtem_vertice(valor_vertice_origem)
        if not vertice_origem:
            return None

        fila_min_heap = MinHeap()
        #inicialização
        for vertice in self.vertices.values():
            distancia[vertice] = DistanciaVerticeOrigem(vertice, float("inf"))
            pai[vertice] = None
            fila_min_heap.insere(distancia[vertice])
        #print(f"HEAP: {fila_min_heap}")
        #print(f"Vertice Origem: {vertice_origem.valor}")

        #escreva o código abaixo para preencher as veriaveis distancia e pai adequadamente
        distancia[vertice_origem].distancia = 0
        while fila_min_heap.pos_ultimo_item > 0:
            vertice = self.obtem_vertice(
                fila_min_heap.retira_min().vertice.valor)
            for adjacencia in vertice.adjacencias:
                self.dijkstra_relax(fila_min_heap, vertice, adjacencia,
                                    distancia, pai)

        return distancia, pai
示例#2
0
    def cria_arv_geradora_minima(
            self, valor_vertice_inicial) -> Dict[Vertice, Vertice]:
        pai = {}
        set_ja_explorado = set()
        peso = {}
        vertice_inicial = self.obtem_vertice(valor_vertice_inicial)
        if not vertice_inicial:
            return None

        fila_min_heap = MinHeap()
        for vertice in self.vertices.values():
            pai[vertice] = None
            peso[vertice] = PesoVertice(vertice, float("inf"))

        peso[vertice_inicial].peso = 0
        fila_min_heap.insere(peso[vertice_inicial])
        #print(f"HEAP: {fila_min_heap}")
        #print(f"Vertice Origem: {vertice_inicial.valor}")
        #print(f"HEAP vertice origem: {fila_min_heap.retira_min().vertice_destino.valor}")

        while len(fila_min_heap.arr_heap) > 1:
            vertice = self.obtem_vertice(
                fila_min_heap.retira_min().vertice_destino.valor)
            set_ja_explorado.add(vertice)
            for adjacencia in vertice.adjacencias:
                distancia_aresta = vertice.adjacencias[adjacencia]
                if adjacencia not in set_ja_explorado and distancia_aresta < peso[
                        adjacencia].peso:
                    pai[adjacencia] = vertice
                    peso[adjacencia].peso = distancia_aresta
                    fila_min_heap.insere(peso[adjacencia])

        return pai
示例#3
0
    def test_retira_min(self):
        obj_heap = MinHeap()
        obj_heap.arr_heap = [None, -12, -9, -4, -7, -5, 3, 0, 1, -2, -3, 2]

        min_val = obj_heap.retira_min()
        self.assertEqual(
            min_val, -12,
            f"Não foi retirado o menor valor (-12) e sim {min_val} ")
        self.assertListEqual(
            obj_heap.arr_heap, [None, -9, -7, -4, -2, -5, 3, 0, 1, 2, -3],
            f"A operação test_retira_min não finalizou com o Heap esperado. ")

        obj_heap.arr_heap = [None, -12]
        min_val = obj_heap.retira_min()
        self.assertEqual(
            min_val, -12,
            f"Não foi retirado o menor valor (-12) e sim {min_val} ")
        self.assertListEqual(
            obj_heap.arr_heap, [None],
            f"A operação test_retira_min não finalizou com o Heap esperado. ")
示例#4
0
	def cria_arv_geradora_minima(self, valor_vertice_inicial) -> Dict[Vertice,Vertice]:
		pai = {}
		fila_min_heap = MinHeap()
		set_ja_explorado = set()
		peso = {}
		vertice_inicial = self.obtem_vertice(valor_vertice_inicial)

		if not vertice_inicial:
			return None

		#para cada u que pertence aos vertices do grafo faca:
		for vertice in self.vertices.values():
			#pai[u] <- NULL
			pai[vertice] = None
			#menor_peso[u] <- infinito
			peso[vertice] = PesoVertice(vertice, float("inf"))

		#menor_peso[raiz] <- 0
		peso[vertice_inicial].peso = 0
		#INSERE(Q,raiz)
		fila_min_heap.insere(peso[vertice_inicial])

		#enquanto a fila nao estiver vazia
		while len(fila_min_heap.arr_heap)>1:
			#u <- EXTRAI_MIN(Q)
			peso_vertice_u = fila_min_heap.retira_min()

			#acha o vertice correspondente ao peso extraido da fila
			for vertice, valor in peso.items():
				if valor == peso_vertice_u:
					vertice_u = vertice

			#A <- A U {u}
			set_ja_explorado.add(vertice_u)

			#para cada vertice v adjacente ao vertice u faca:
			for vertice_v in vertice_u.adjacencias.keys():
				peso_aresta_uv = vertice_u.adjacencias[vertice_v]

				#se o vertice v ainda nao foi visitado e se o peso da aresta uv for menor que o menor peso vinculado ao vertice v faca:
				if vertice_v not in set_ja_explorado and peso_aresta_uv < peso[vertice_v].peso:
					#pai[v] <- u
					pai[vertice_v] = vertice_u
					#menor_peso[v] <- w[u,v]
					peso[vertice_v].peso = peso_aresta_uv
					#INSERE(Q,v)
					fila_min_heap.insere(peso[vertice_v])

		#retorna o caminho da arvore criada
		return pai