Advertisement
milardovich

Dijkstra

Jun 30th, 2016
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.59 KB | None | 0 0
  1. def dijkstra(grafo,fuente,destino,visitadas=[],distancias={},predecesores={}):
  2.     '''
  3.        Algoritmo de Dijkstra - calcular trayectoria entre dos ciudades
  4.    '''
  5.     if fuente not in grafo:
  6.         raise TypeError('No se encontro la ciudad raiz dentro del grafo')
  7.     if destino not in grafo:
  8.         raise TypeError('no se pudo encontrar la trayectoria dentro del grafo')
  9.     if fuente == destino:
  10.         # We build the shortest camino and display it
  11.         camino=[]
  12.         pred=destino
  13.         while pred != None:
  14.             camino.append(pred)
  15.             pred=predecesores.get(pred,None)
  16.         print str(camino)
  17.     else :
  18.         if not visitadas:
  19.             distancias[fuente]=0
  20.         for vecino in grafo[fuente] :
  21.             if vecino not in visitadas:
  22.                 distancia_nueva = distancias[fuente] + grafo[fuente][vecino]
  23.                 if distancia_nueva < distancias.get(vecino,float('inf')):
  24.                     distancias[vecino] = distancia_nueva
  25.                     predecesores[vecino] = fuente
  26.         visitadas.append(fuente)
  27.         sinvisitar={}
  28.         for k in grafo:
  29.             if k not in visitadas:
  30.                 sinvisitar[k] = distancias.get(k,float('inf'))        
  31.         x=min(sinvisitar, key=sinvisitar.get)
  32.         dijkstra(grafo,x,destino,visitadas,distancias,predecesores)
  33.        
  34.  
  35.  
  36. if __name__ == "__main__":
  37.     grafo = {
  38.             'c1': {'c2': 1},
  39.             'c2': {'c3': 1},
  40.             'c3': {},
  41.             'c4': {'c5': 1, 'c6': 1},
  42.             'c5': {'c6': 1},
  43.             'c6': {}
  44.     }
  45.     dijkstra(grafo,'c1','c3')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement