Алгоритм Дейкстры. Задача №1.

(открыть в новой вкладке)

Найти кратчайший путь во взвешенном графе, используя алгоритм Дейкстры.

Граф:

Код:
from math import inf


def function_node(costs):
    lowest_cost = inf
    lowest_cost_node = None
    for node in costs:
        cost = costs[node]
        if cost < lowest_cost and node not in processed:                                                                            # обязательно берём минимальную цену, т.к. неизвестная цена всегда бесконечность
            lowest_cost = cost
            lowest_cost_node = node
    return lowest_cost_node                                                                                                         # функция вернёт узел с минимальной ценой из ХЕШ-ТАБЛИЦЫ ДЛЯ ХРАНЕНИЯ СТОИМОСТИ ВСЕХ УЗЛОВ


#############################################################################
#############################################################################
"""СОЗДАНИЕ ГРАФА С ИСПОЛЬЗОВАНИЕМ ХЕШ-ТАБЛИЦЫ. ВХОДНЫЕ ДАННЫЕ."""
graph = {}                                                                                                                          # словарь соседей со стоимостями перехода ---> {'Начало': {'а': 6, 'в': 2}, 'а': {'Конец': 1}, 'в': {'а': 3, 'Конец': 5}, 'Конец': {}}

# начало                                                                                    
graph["Начало"] = {}                                                                                    
graph["Начало"]["а"] = 6                                                                                    
graph["Начало"]["в"] = 2                                                                                    

# а                                                                                 
graph["а"] = {}                                                                                 
graph["а"]["Конец"] = 1                                                                                 

# в                                                                                 
graph["в"] = {}                                                                                 
graph["в"]["а"] = 3                                                                                 
graph["в"]["Конец"] = 5                                                                                 

# Конец                                                                                 
graph["Конец"] = {}                                                                                                                 # у конечного узла нет соседей
#############################################################################
#############################################################################
"""ХЕШ-ТАБЛИЦА ДЛЯ ХРАНЕНИЯ СТОИМОСТИ ВСЕХ УЗЛОВ. ЗАПОЛНЯЕТСЯ В ПРОЦЕССЕ."""                                                     
costs = {}                                                                                                                          # ---> {'а': 6, 'в': 2, 'Конец': inf}
costs["а"] = 6                                                                                  
costs["в"] = 2                                                                                  
costs["Конец"] = inf                                                                                                                # пока это бесконечность                                                                            
#############################################################################
#############################################################################
"""ХЕШ-ТАБЛИЦА ДЛЯ РОДИТЕЛЕЙ. ЗАПОЛНЯЕТСЯ В ПРОЦЕССЕ."""                                                                                 
parents = {}                                                                                                                        # ---> {'а': 'Начало', 'в': 'Начало', 'Конец': None}
parents["а"] = "Начало"                         
parents["в"] = "Начало"                         
parents["Конец"] = None                         
#############################################################################
#############################################################################
"""СПИСОК ДЛЯ ОТСЛЕЖИВАНИЯ ВСЕХ УЖЕ ОБРАБОТАННЫХ УЗЛОВ. НУЖЕН ДЛЯ ИЗБЕЖАНИЯ ЦИКЛОВ."""                           
processed = []                          

node = function_node(costs)                                                                                                        # найдём узел с наименьшей стоимостью из уже известных и необработанных ---> к примеру: в
while node is not None:                                                                                                            # цикл завершится, если обработаны все узлы
    cost = costs[node]                                                                                                             # ---> int; цена для узла, он же узел с наименьшей стоимостью
    neighbors = graph[node]                                                                                                        # ---> 'в': {'а': 3, 'Конец': 5}; соседи узла
    for n in neighbors.keys():                                                                                                     # переберём всех соседей текущего узла
        new_cost = cost + neighbors[n]                                                                                             # цена для соседа текущего узла
        if costs[n] > new_cost:                                                                                                    # проверка цены в хеш-таблице
            costs[n] = new_cost                                                                                                    # обновим, если новая цена меньше той, что в хеш-таблице
            parents[n] = node                                                                                                      # обновим родителя, если новая цена меньше той, что в хеш-таблице
    processed.append(node)                                                                                                         # помещаем узел в список обработанных узлов
    node = function_node(costs)                                                                                                    # найдём узел с наименьшей стоимостью из уже известных и необработанных

print()
print("Словарь с наименьшими ценами для узлов", costs)
print()
print("Словарь с родителями для узлов", parents)
print()