Ejemplo n.º 1
0
def kruskal(grafo):
    '''Algoritmo de Kruskal para hallar el árbol de expansión mínimo'''
    bosque = []
    aristas = Heap(tamanio_grafo(grafo)**2)
    aux = grafo.inicio
    while aux is not None:
        bosque.append([aux.info])
        adyac = aux.adyacentes.inicio
        while adyac is not None:
            arribo_heap(aristas, [aux.info, adyac.destino], adyac.info)
            adyac = adyac.sig
        aux = aux.sig
    while len(bosque) > 1 and not heap_vacio(aristas):
        dato = atencion_heap(aristas)
        origen = None
        for elemento in bosque:
            if dato[1][0] in elemento:
                origen = bosque.pop(bosque.index(elemento))
                break
        destino = None
        for elemento in bosque:
            if dato[1][1] in elemento:
                destino = bosque.pop(bosque.index(elemento))
                break
        if origen is not None and destino is not None:
            if len(origen) > 1 and len(destino) == 1:
                destino = [dato[1][0], dato[1][1]]
            elif len(destino) > 1 and len(origen) == 1:
                origen = [dato[1][0], dato[1][1]]
            elif len(destino) > 1 and len(origen) > 1:
                origen += [dato[1][0], dato[1][1]]
            bosque.append(origen + destino)
        else:
            bosque.append(origen)
    return bosque[0]
def punto2():
    cola_prioridad = Heap(10)
    # a b y c
    trajes = [
        'Mark XLIV', 'Mark XV', 'Mark I', 'Mark V', 'Mark IV', 'Mark II',
        'Mark VII'
    ]
    estado = ['Producir', 'Reparar']
    pos = 0
    for i in range(len(trajes)):
        arribo_heap(cola_prioridad, trajes[pos], randint(1, 3), choice(estado))
        pos += 1
    print()
    print('Se atiende los 3 primeros trajes')
    for i in range(3):
        print(atencion_heap(cola_prioridad))
    print()
    print('Inserto 3 trajes nuevos(Mark XLV, XXL y III)')
    print()
    arribo_heap(cola_prioridad, 'Mark XLV', 3, 'Reparar')
    arribo_heap(cola_prioridad, 'Mark XXL', 2, 'Producir')
    arribo_heap(cola_prioridad, 'Mark III', 1, 'Reparar')

    while not heap_vacio(cola_prioridad):
        print(atencion_heap(cola_prioridad))
Ejemplo n.º 3
0
def prim(grafo):
    '''Algoritmo de Prim para hallar el árbol de expansión mínimo'''
    bosque = []
    aristas = Heap(tamanio_grafo(grafo)**2)
    adyac = grafo.inicio.adyacentes.inicio
    while adyac is not None:
        arribo_heap(aristas, [grafo.inicio.info, adyac.destino], adyac.info)
        adyac = adyac.sig
    while len(bosque) // 2 < tamanio_grafo(grafo) and not heap_vacio(aristas):
        dato = atencion_heap(aristas)
        if len(bosque) == 0 or ((dato[1][0] not in bosque) ^
                                (dato[1][1] not in bosque)):
            bosque += dato[1]
            destino = buscar_vertice(grafo, dato[1][1])
            adyac = destino.adyacentes.inicio
            while adyac is not None:
                arribo_heap(aristas, [destino.info, adyac.destino], adyac.info)
                adyac = adyac.sig
    return bosque
Ejemplo n.º 4
0
def dijkstra_red(grafo, origen, destino):
    '''Dijkstra para hallar el camino mas corto'''
    no_visitados = Heap(tamanio_grafo(grafo))
    camino = Pila()
    aux = grafo.inicio
    while aux is not None:
        if aux.info.nombre == origen:
            arribo_heap(no_visitados, [aux, None], 0)
        else:
            arribo_heap(no_visitados, [aux, None], inf)
        aux = aux.sig
    while not heap_vacio(no_visitados):
        dato = atencion_heap(no_visitados)
        apilar(camino, dato)
        aux = dato[1][0].adyacentes.inicio
        while aux is not None:
            pos = busqueda_heap_red(no_visitados, aux.destino)
            if no_visitados.vector[pos][0] > dato[0] + aux.info:
                no_visitados.vector[pos][1][1] = dato[1][0].info.nombre
                cambiar_prioridad(no_visitados, pos, dato[0] + aux.info)
            aux = aux.sig
    return camino