def criarMSTmodificado(g: Grafo, caixas): chaves = list(caixas.keys()) chaves.sort() mst = Grafo() ok = False for i in range(len(chaves)): chave = chaves[i] while len(caixas[chave]) != 0: aresta = caixas[chave].pop() peso = int(aresta[0]) aresta = aresta[1:] v1 = aresta[0] v2 = aresta[-1] arvoresDiferentes = False if not mst.existe_vertice(v1): mst.adiciona_vertice(v1) arvoresDiferentes = True if not mst.existe_vertice(v2): mst.adiciona_vertice(v2) arvoresDiferentes = True if not mst.existe_aresta(aresta): if (arvoresDiferentes): mst.adiciona_aresta(aresta, peso) if (mst.quantidadeVertices == g.quantidadeVertices): ok = True break if (ok): break return mst
def Prim(g: Grafo): if (g.quantidadeVertices == 0): return None mst = Grafo() raiz = ModificacaoPrim(g) # Modificação raiz = random.randint( 0, (g.quantidadeVertices - 1)) # Vertice Aleatório (Desativar linha) print("Vertice Inicial: " + g.N[raiz] + "\n") mst.adiciona_vertice(g.N[raiz]) ligacoesValidas = [0] * g.quantidadeVertices for i in range(g.quantidadeVertices): ligacoesValidas[i] = graphLibrary.grau(g, g.N[i]) arestasDaFilaPrincipal = {} FilaPrincipal = PriorityQueue() aux = 0 while (mst.quantidadeVertices != g.quantidadeVertices): for k in range(aux, len(mst.N)): Vertex = mst.N[k] idx = g.N.index(Vertex) if (ligacoesValidas[idx] == 0): continue for i in range(idx, len(g.M[idx])): if (g.M[idx][i] > 0): # encontrei um vertice fora da arvore v = g.N[i] # Possivel novo vertice if not (mst.existe_vertice(v)): pesoArestaEncontrada = g.Mfila[idx][i].seeFist() arestaEncontrada = g.N[idx] + '-' + g.N[i] if pesoArestaEncontrada in arestasDaFilaPrincipal.keys( ): arestasDaFilaPrincipal[ pesoArestaEncontrada].append(arestaEncontrada) else: arestasDaFilaPrincipal[pesoArestaEncontrada] = [ arestaEncontrada ] FilaPrincipal.insert(pesoArestaEncontrada) idxfixo = idx while ((idx - 1) >= 0): if (g.M[idx - 1][idxfixo] > 0): v = g.N[idx - 1] # Possivel novo vertice if not (mst.existe_vertice(v)): pesoArestaEncontrada = g.Mfila[idx - 1][idxfixo].seeFist() arestaEncontrada = g.N[idx - 1] + '-' + g.N[idxfixo] if pesoArestaEncontrada in arestasDaFilaPrincipal.keys( ): arestasDaFilaPrincipal[ pesoArestaEncontrada].append(arestaEncontrada) else: arestasDaFilaPrincipal[pesoArestaEncontrada] = [ arestaEncontrada ] FilaPrincipal.insert(pesoArestaEncontrada) idx -= 1 menorPesoAresta = FilaPrincipal.remove() novaAresta = arestasDaFilaPrincipal[menorPesoAresta].pop() v1 = novaAresta[0] v2 = novaAresta[-1] novoVertice = None if not mst.existe_vertice(v1): novoVertice = v1 aux += 1 if not mst.existe_vertice(v2): novoVertice = v2 aux += 1 if (novoVertice != None): mst.adiciona_vertice(novoVertice) mst.adiciona_aresta(novaAresta, menorPesoAresta) idxV1 = g.N.index(v1) idxV2 = g.N.index(v2) ligacoesValidas[idxV1] -= 1 ligacoesValidas[idxV2] -= 1 return mst