Exemplo n.º 1
0
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
Exemplo n.º 2
0
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