Quick actions

cmd+k|ctrl+k

Navigation

Languages

Ejercicio de TDijkastra

Snippet info

Language

Python

Visibility

public

Author

emrb2309

Created

2024-10-30T17:55:11.71179Z

Updated

2024-10-30T18:09:42.554483Z

import heapq

# Definición del grafo como diccionario de adyacencias
grafo = {
    'A': {'B': 30, 'C': 90},
    'B': {'C': 72, 'D': 30, 'E': 48},
    'C': {'D': 120, 'F': 150, 'G': 180},
    'D': {'E': 100, 'G': 60},
    'E': {'F': 150},
    'F': {'G': 72},
    'G': {}
}

def dijkstra(grafo, inicio, fin):
    # Inicializamos la cola de prioridad con el nodo inicial y distancia 0
    cola, distancias, camino = [(0, inicio)], {inicio: 0}, {}
    
    # Procesamos los nodos en la cola de prioridad
    while cola:
        distancia, nodo = heapq.heappop(cola)
        if nodo == fin:  # Si alcanzamos el nodo destino, terminamos
            break
        # Recorremos los vecinos del nodo actual
        for vecino, peso in grafo[nodo].items():
            nueva_dist = distancia + peso  # Calculamos la nueva distancia
            # Si encontramos una ruta más corta hacia el vecino
            if nueva_dist < distancias.get(vecino, float('inf')):
                distancias[vecino], camino[vecino] = nueva_dist, nodo  # Actualizamos distancia y predecesor
                heapq.heappush(cola, (nueva_dist, vecino))  # Añadimos el vecino a la cola

    # Reconstruimos la ruta óptima desde el nodo destino hacia el inicio
    ruta, paso = [], fin
    while paso:
        ruta.insert(0, paso)  # Insertamos el nodo al inicio de la ruta
        paso = camino.get(paso)  # Retrocedemos usando el diccionario de predecesores
    
    # Devolvemos la distancia mínima y la ruta
    return distancias.get(fin, float('inf')), ruta

# Ejecución del algoritmo para encontrar el camino más corto desde A hasta G
costo, ruta = dijkstra(grafo, 'A', 'G')
print("Costo mínimo:", costo)
print("Ruta más corta:", " -> ".join(ruta))
INFO