def Dijkstra(grafo, origen, destino):
    """
    Implementación del algoritmo de Dijkstra para encontrar el camino más corto entre un nodo origen y un nodo destino en un grafo ponderado.
    
    Parámetros:
    - grafo: Un diccionario que representa el grafo ponderado. Las claves son los nodos del grafo y los valores son diccionarios que contienen los nodos adyacentes como claves y sus respectivos pesos como valores.
    - origen: El nodo de origen desde el cual se inicia la búsqueda del camino más corto.
    - destino: El nodo de destino al cual se desea llegar desde el nodo origen.
    
    Devuelve:
    - distancias: Un diccionario que contiene las distancias mínimas desde el nodo origen hasta cada nodo del grafo. Las claves son tuplas (origen, destino) y los valores son las distancias mínimas.
    - camino: Una lista que representa el camino más corto desde el nodo origen hasta el nodo destino. Si no hay un camino entre el origen y el destino, devuelve una lista vacía.
    
    Nota:
    - Si no hay un camino desde el origen hasta el destino, el camino devuelto será una lista vacía.
    - Los pesos de las aristas deben ser números enteros o flotantes. Si un peso es 'inf', se interpreta como un camino no disponible.
    """

    # Inicialización
    L = {(origen, nodo): float('inf') for nodo in grafo}  # L(origen, v) para todos los nodos es infinito
    L[(origen, origen)] = 0  # L(origen, origen) = 0 para el nodo inicial
    S = set()  # S es el conjunto vacío
    camino_previo = {nodo: None for nodo in grafo}  # Para reconstruir el camino más corto

    while len(S) < len(grafo):
        # u := vértice con L(u) mínima entre los vértices que no están en S
        u = min(((origen, nodo) for nodo in grafo if (origen, nodo) not in S), key=lambda nodo: L[nodo])

        # Añadir u al conjunto S
        S.add(u)

        # Para todos los vértices v que no están en S
        for v, peso in grafo[u[1]].items():
            if (origen, v) not in S:
                # if L(u) + w(u, v) < L(v) then L(v) := L(u) + w(u, v)
                if peso == 'inf':
                    peso = float('inf')
                if L[u] + peso < L[(origen, v)]:
                    L[(origen, v)] = L[u] + peso
                    camino_previo[v] = u[1]  # Guardar el nodo previo para reconstruir el camino

    # Reconstruir el camino más corto desde el origen hasta el destino
    nodo_actual = destino
    camino = []
    while nodo_actual is not None:
        camino.insert(0, nodo_actual)  # Insertar al inicio para obtener el camino en orden 'a' -> 'z'
        nodo_actual = camino_previo[nodo_actual]

    return L, camino

# Representación del grafo de la Figura 4 (pág 559 K. Rosen)
grafo = {
  'a': {'b': 4, 'c': 2, 'd': 'inf', 'e': 'inf', 'z': 'inf'},
  'b': {'a': 4, 'c': 1, 'd': 5, 'e': 'inf', 'z': 'inf'},
  'c': {'a': 2, 'b': 1, 'd': 8, 'e': 10, 'z': 'inf'},
  'd': {'a': 'inf', 'b': 5, 'c': 8, 'e': 2, 'z': 6},
  'e': {'a': 'inf', 'b': 'inf', 'c': 10, 'd': 2, 'z': 3},
  'z': {'a': 'inf', 'b': 'inf', 'c': 'inf', 'd': 6, 'e': 3}
}

nodo_origen = 'a'
nodo_destino = 'z'
distancias, camino = Dijkstra(grafo, nodo_origen, nodo_destino)
distancia_total = distancias[(nodo_origen, nodo_destino)]
print("Distancias mínimas:", {f"{nodo_origen}-{nodo}": distancia for (origen, nodo), distancia in distancias.items() if origen == nodo_origen})
print(f"El camino más corto desde el nodo {nodo_origen} hasta el nodo {nodo_destino} es: {', '.join(camino)}, con una longitud de {distancia_total}")

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: