Quick actions

cmd+k|ctrl+k

Navigation

Languages

programacionI - Gonzalo Perrone

Snippet info

Language

Python

Visibility

public

Author

gonza19913

Created

2024-11-03T02:14:10.075513Z

Updated

2024-11-03T22:21:21.764121Z

import sys

class Grafo:
    def __init__(self, num_nodos):
        self.num_nodos = num_nodos
        self.matriz_adyacencia = [[0] * num_nodos for _ in range(num_nodos)]
        self.nodos = {i: chr(65 + i) for i in range(num_nodos)}

    def agregar_arista(self, origen, destino, peso):
        if 0 <= origen < self.num_nodos and 0 <= destino < self.num_nodos:
            self.matriz_adyacencia[origen][destino] = peso

    def mostrar_matriz(self):
        print("Matriz de adyacencia:")
        for fila in self.matriz_adyacencia:
            print(fila)
        print()

    def dijkstra(self, inicio):
        distancias = [sys.maxsize] * self.num_nodos
        distancias[inicio] = 0
        visitados = [False] * self.num_nodos
        predecesores = [-1] * self.num_nodos

        for _ in range(self.num_nodos):
            nodo_actual = min((dist for dist in range(self.num_nodos) if not visitados[dist]), key=distancias.__getitem__)
            visitados[nodo_actual] = True

            for vecino, peso in enumerate(self.matriz_adyacencia[nodo_actual]):
                if peso > 0 and not visitados[vecino] and distancias[nodo_actual] + peso < distancias[vecino]:
                    distancias[vecino] = distancias[nodo_actual] + peso
                    predecesores[vecino] = nodo_actual

        self.mostrar_resultado(distancias, predecesores, inicio)

    def mostrar_resultado(self, distancias, predecesores, inicio):
        print(f"Desde el nodo {self.nodos[inicio]}:")
        for destino in range(self.num_nodos):
            if destino != inicio:
                camino = self.construir_camino(predecesores, destino)
                print(f"Hasta {self.nodos[destino]}: {' -> '.join(camino)}, Costo: {distancias[destino]}")

    def construir_camino(self, predecesores, destino):
        camino = []
        while destino != -1:
            camino.insert(0, self.nodos[destino])
            destino = predecesores[destino]
        return camino

# Ejemplo de uso
grafo = Grafo(5)
grafo.agregar_arista(0, 1, 10)
grafo.agregar_arista(0, 4, 3)
grafo.agregar_arista(1, 2, 2)
grafo.agregar_arista(2, 3, 9)
grafo.agregar_arista(4, 1, 4)
grafo.agregar_arista(4, 2, 8)
grafo.mostrar_matriz()
grafo.dijkstra(0)
INFO