Топологическая сортировка - линейное упорядочивание вершин, которое нужно, чтобы понять, как обходить вершины ориентированного графа.
Пример: Например есть вот такой граф:
Линейное упорядочивание будет для этого графа вот таким:
- Чтобы понять как обходить граф, если есть такая ситуация, что мы не можем выполнять некоторые действия до завершения других
-
Создаем массив для линейного упорядочивания, заполняем нулями
-
Рассчитываем количество родителей каждой вершины
-
Находим все родительские вершины, у них в полученном массиве будет 0 родителей
-
Закидываем родителя в конец массива линейного упорядочивания, и у всех детей этой вершины уменьшаем количество родителей на 1. Если появились вершины, у которых кол-во родителей стало = 0, тогда эта вершина стала родительской и нужно опять проделать те же операции.
-
Повторяем шаг 4 пока родители не закончатся, а потом фильтруем полученный массив от нулей
Время работы топологической сортировки О(n+m)
-
Получаем линейное упорядочивание топологической сортировкой
-
Создаем два массива
shortest
иpred
- кратчайшие расстояния и кратчайшие пути -
Заполняем массив
shortest
бесконечностями, чтобы обозначить недосягаемые вершины, а массивpred
значениямиNone
. -
shortest[s] = 0
, гдеs
- стартовая вершина -
Перебираем все смежные вершины с вершинами из линейного упорядочивания и смотрим - нашелся ли путь короче, и заменяем.
Время работы алгоритма О(n+m)
Алгоритм нужен для поиска кратчайшего пути между двумя точками.
Алгоритм:
- Создаем два массива
shortest
иpred
- кратчайшие расстояния и кратчайшие пути - Заполняем массив
shortest
бесконечностями, чтобы обозначить недосягаемые вершины, а массивpred
значениямиNone
. - Создаем множество
Q
, содержащее все вершины - Организуем цикл: пока
Q
не пустое находим во множестве Q вершину с наименьшим значением в массивеshortest
и удаляем ее из множества - Перебираем все смежные вершины с удаленной из множества и меняем пути в массиве shortest на более короткие путем сравнения с начальным значением.