Назад к вопросам
Middle
66
questionbank
Что такое алгоритм Дейкстры?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Алгоритм Дейкстры находит кратчайшие пути от одной начальной вершины до всех остальных вершин во взвешенном ориентированном или неориентированном графе с неотрицательными весами ребер.
Принцип работы:
- Инициализация: Присваивает начальной вершине расстояние 0, а всем остальным — бесконечность. Все вершины, кроме начальной, помечаются как непосещенные.
- Итерация: Пока есть непосещенные вершины:
- Выбирает непосещенную вершину с наименьшим текущим расстоянием.
- Помечает ее как посещенную.
- Для всех ее соседей, если путь через текущую вершину короче текущего кратчайшего пути до соседа, обновляет расстояние до соседа.
Структуры данных:
- Часто используются приоритетная очередь (например, на основе кучи) для эффективного выбора вершины с минимальным расстоянием.
- Массив или словарь для хранения текущих кратчайших расстояний.
Ограничения:
- Работает только с неотрицательными весами ребер.
# Пример реализации на Python с использованием heapq для приоритетной очереди
import heapq
def dijkstra(graph, start_node):
distances = {node: float('inf') for node in graph} # Инициализация расстояний
distances[start_node] = 0 # Расстояние до начальной вершины 0
priority_queue = [(0, start_node)] # Приоритетная очередь: (расстояние, вершина)
while priority_queue:
current_distance, current_node = heapq.heappop(priority_queue) # Извлекаем вершину с наименьшим расстоянием
if current_distance > distances[current_node]: # Если уже найден более короткий путь, пропускаем
continue
for neighbor, weight in graph[current_node].items(): # Проверяем соседей
distance = current_distance + weight # Вычисляем новое расстояние
if distance < distances[neighbor]: # Если новый путь короче
distances[neighbor] = distance # Обновляем расстояние
heapq.heappush(priority_queue, (distance, neighbor)) # Добавляем соседа в очередь
return distances
# Пример графа представленный в виде словаря смежности: {узел: {сосед: вес}}
graph = {
'A': {'B': 1, 'C': 4},
'B': {'A': 1, 'C': 2, 'D': 5},
'C': {'A': 4, 'B': 2, 'D': 1},
'D': {'B': 5, 'C': 1}
}
start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
# print(shortest_paths) # {'A': 0, 'B': 1, 'C': 3, 'D': 4}