Что делает: сортирует вершины ациклического ориентированного графа так, чтобы все ребра были направлены слева направо и чтобы любое ребро вело от вершины с меньшим номером к вершине с большим номером
Где применяется: быстрое нахождение кратчайших путей в DAG, конденсация графа, еще че то та
Чего | Точная оценка | Почему |
---|---|---|
Время | O( | V |
Память | O( | V |
Общая идея:
С помощью DFS вычислить времена выхода вершин (когда красим в чёрный) и после завершении работы над вершиной внеси её в начало массива, затем ревёрснуть массив и все будет чики пуки
Реализация:
// псевдокод писала Я так что чекните если что не так!
int main() {
for u из G(V) do
u.color = white // помечаем все вершинки белым O(|V|)
for u из G(V) do
if (u.color == white) // запускаем DFS для всех не пройденных вершинок
topsortDFS(u)
}
void topsortDFS(int u) {
for v из G(V) do
if v.color == white
DFS(v)
u.color = black // после обхода всех смежных вершин помечаем, что вершина прошла DFS
result.push_back(u) // т.к. при окраске в чёрный цвет можно вычислить время выхода
// вершинки, после обхода DFSом закидываем вершину в массив
}
int main(): // в мейне
cout << result.reverse() // выводим массив в обратном порядке
‼ Особенности топсорта:
Визуализация: этим я займусь чуть попозже