fork download
  1. def find_shortest_path(graph, start, end):
  2. """
  3. Знаходить найкоротший шлях між двома вершинами орієнтованого графа.
  4.  
  5. Args:
  6. graph: Орієнтований граф.
  7. start: Початкова вершина.
  8. end: Кінцева вершина.
  9.  
  10. Returns:
  11. Список вершин, що утворюють найкоротший шлях.
  12. """
  13.  
  14. # Створюємо матрицю відстаней між вершинами.
  15. distances = [[float("inf")] * len(graph) for _ in range(len(graph))]
  16. distances[start][start] = 0
  17.  
  18. # Виконуємо алгоритм Дейкстри.
  19. for vertex in range(len(graph)):
  20. for neighbor in graph[vertex]:
  21. if distances[vertex][neighbor] > distances[vertex][start] + graph[vertex][neighbor]:
  22. distances[neighbor] = distances[vertex][start] + graph[vertex][neighbor]
  23.  
  24. # Повертаємо список вершин, що утворюють найкоротший шлях.
  25. path = [end]
  26. while path[-1] != start:
  27. for neighbor in graph[path[-1]]:
  28. if distances[path[-1]][neighbor] == distances[end] - graph[path[-1]][neighbor]:
  29. path.append(neighbor)
  30. break
  31. return path[::-1]
  32.  
  33.  
  34. if __name__ == "__main__":
  35. # Створюємо граф.
  36. graph = [[0, 10, 5], [10, 0, 2], [5, 2, 0]]
  37.  
  38. # Знаходимо найкоротший шлях.
  39. path = find_shortest_path(graph, 0, 2)
  40.  
  41. # Виводимо результат.
  42. print("Найкоротший шлях:", path)
  43.  
Success #stdin #stdout 0.02s 25688KB
stdin
Standard input is empty
stdout
def find_shortest_path(graph, start, end):
  """
  Знаходить найкоротший шлях між двома вершинами орієнтованого графа.

  Args:
    graph: Орієнтований граф.
    start: Початкова вершина.
    end: Кінцева вершина.

  Returns:
    Список вершин, що утворюють найкоротший шлях.
  """

  # Створюємо матрицю відстаней між вершинами.
  distances = [[float("inf")] * len(graph) for _ in range(len(graph))]
  distances[start][start] = 0

  # Виконуємо алгоритм Дейкстри.
  for vertex in range(len(graph)):
    for neighbor in graph[vertex]:
      if distances[vertex][neighbor] > distances[vertex][start] + graph[vertex][neighbor]:
        distances[neighbor] = distances[vertex][start] + graph[vertex][neighbor]

  # Повертаємо список вершин, що утворюють найкоротший шлях.
  path = [end]
  while path[-1] != start:
    for neighbor in graph[path[-1]]:
      if distances[path[-1]][neighbor] == distances[end] - graph[path[-1]][neighbor]:
        path.append(neighbor)
        break
  return path[::-1]


if __name__ == "__main__":
  # Створюємо граф.
  graph = [[0, 10, 5], [10, 0, 2], [5, 2, 0]]

  # Знаходимо найкоротший шлях.
  path = find_shortest_path(graph, 0, 2)

  # Виводимо результат.
  print("Найкоротший шлях:", path)