fork(4) download
  1. graph = {} # Задаём граф и вершину, от которой надо определить расстояния.
  2. for v1, v2, d in (('x1', 'x2', 3),
  3. ('x1', 'x4', 5),
  4. ('x2', 'x4', 2),
  5. ('x2', 'x7', 7),
  6. ('x3', 'x2', 3),
  7. ('x3', 'x6', 9),
  8. ('x4', 'x5', 1),
  9. ('x4', 'x6', 5),
  10. ('x5', 'x6', 8),
  11. ('x5', 'x7', 6),
  12. ('x6', 'x7', 10),
  13. ('x7', 'x3', 4),
  14. ('x7', 'x8', 4),
  15. ('x8', 'x6', 12)):
  16. assert d >= 0 # Все расстояния неотрицательны.
  17. graph.setdefault(v1, {})
  18. graph.setdefault(v2, {})
  19. assert v2 not in graph[v1] # Нельзя расстояние между двумя вершинами вводить дважды.
  20. graph[v1][v2] = d
  21.  
  22. print graph
  23.  
  24. def Dijkstra(graph, v0):
  25. distance = dict.fromkeys(graph, float('inf')) # Определяем словарь вершин с расстояниями до заданной равными бесконечности.
  26. distance[v0] = 0 # Задаём расстояние от заданной вершины до самой себя равным 0.
  27. print v0, distance
  28. vertex = set(graph) # Определяем множество вершин, для которых будем затем в цикле высчитывать расстояния.
  29. while vertex: # Пока есть необработанные вершины, продолжаем цикл.
  30. v1 = min(vertex, key=distance.get) # Определяем среди необработанных вершин, вершину с минимальным расстоянием до заданной.
  31. vertex.remove(v1) # Сейчас от неё будет вычислены расстояния до соседних и поэтому её можно удалить из множества необработанных вершин.
  32. for v, d in graph[v1].items(): # От выбранной вершины, для всех расстояний, если новое расстояние короч чем чем старое, то заносим новое.
  33. distance[v] = min(distance[v], distance[v1] + d)
  34. print v1, distance
  35. return distance # Возвращаем решение в виде словаря расстояний от заданной вершины.
  36.  
  37. print Dijkstra(graph, 'x1')
  38.  
Runtime error #stdin #stdout 0.08s 10840KB
stdin
Standard input is empty
stdout
Standard output is empty