예제 #1
0
 def dijkstra(self, ver_origen, ver_destino):
     """Algoritmo de Dijkstra para hallar el camino mas corto."""
     no_visitados = HeapMin()
     camino = Pila()
     aux = 0
     while (aux < self.tamanio()):
         vertice = self.inicio.obtener_elemento(ver_origen)
         vertice_aux = self.inicio.obtener_elemento(aux)
         vertice_aux['anterior'] = None
         if (vertice_aux['info'] == vertice['info']):
             no_visitados.arribo([vertice_aux['info'], None], 0)
         else:
             no_visitados.arribo([vertice_aux['info'], None], inf)
         aux += 1
     while (not no_visitados.vacio()):
         dato = no_visitados.atencion()
         camino.apilar(dato)
         pos_aux = self.buscar_vertice(dato[1][0])
         vertice_aux = self.inicio.obtener_elemento(pos_aux)
         aristas = 0
         while (aristas < vertice_aux['aristas'].tamanio()):
             arista = vertice_aux['aristas'].obtener_elemento(aristas)
             pos_heap = no_visitados.busqueda(arista['destino'])
             if (pos_heap is not None
                     and no_visitados.elementos[pos_heap][0] >
                     dato[0] + arista['peso']):
                 no_visitados.elementos[pos_heap][1][1] = dato[1][0]
                 nuevo_peso = dato[0] + arista['peso']
                 no_visitados.cambiar_prioridad(pos_heap, nuevo_peso)
             aristas += 1
     # print(no_visitados.elementos)
     return camino
예제 #2
0
 def prim(self):
     """Algoritmo de Prim para hallar el árbol de expansión mínimo."""
     bosque = []
     aristas = HeapMin()
     origen = self.inicio.obtener_elemento(0)
     adyac = 0
     while (adyac < origen['aristas'].tamanio()):
         arista = origen['aristas'].obtener_elemento(adyac)
         aristas.arribo([origen['info'], arista['destino']], arista['peso'])
         adyac += 1
     # print(bosque)
     # print(aristas.elementos)
     # print()
     while (len(bosque) // 2 < self.tamanio() and not aristas.vacio()):
         dato = aristas.atencion()
         if (len(bosque) == 0) or (
             (self.busqueda_prim(bosque, dato[1][0]) is not None) ^
             (self.busqueda_prim(bosque, dato[1][1]) is not None)):
             bosque.append(dato)
             pos_vertice = self.buscar_vertice(dato[1][1])
             nuevo_vertice = self.inicio.obtener_elemento(pos_vertice)
             adyac = 0
             while (adyac < nuevo_vertice['aristas'].tamanio()):
                 arista = nuevo_vertice['aristas'].obtener_elemento(adyac)
                 # print(arista)
                 aristas.arribo([nuevo_vertice['info'], arista['destino']],
                                arista['peso'])
                 adyac += 1
         # print(bosque)
         # print(aristas.elementos)
         # a = input()
     return bosque
예제 #3
0
 def prim(self, inicio=0):
     bosque = []
     aristas = HeapMin()
     origen = self.inicio.obtener_elemento(inicio)
     adyac = 0
     while (adyac < origen['aristas'].tamanio()):
         arista = origen['aristas'].obtener_elemento(adyac)
         aristas.arribo([origen['info'], arista['destino']], arista['peso'])
         adyac += 1
     while (len(bosque) // 2 < self.tamanio() and not aristas.vacio()):
         dato = aristas.atencion()
         if (len(bosque) == 0) or (
             (self.busqueda_prim(bosque, dato[1][0]) is not None) ^
             (self.busqueda_prim(bosque, dato[1][1]) is not None)):
             bosque.append(dato)
             pos_vertice = self.buscar_vertice(dato[1][1])
             nuevo_vertice = self.inicio.obtener_elemento(pos_vertice)
             adyac = 0
             while (adyac < nuevo_vertice['aristas'].tamanio()):
                 arista = nuevo_vertice['aristas'].obtener_elemento(adyac)
                 aristas.arribo([nuevo_vertice['info'], arista['destino']],
                                arista['peso'])
                 adyac += 1
     return bosque