Использование обхода в глубину для топологической сортировки — различия между версиями
Glukos (обсуждение | вклад) (→Постановка задачи) |
Glukos (обсуждение | вклад) (→Алгоритм) |
||
Строка 20: | Строка 20: | ||
fill(visited, false); | fill(visited, false); | ||
time = 0; | time = 0; | ||
− | for ( | + | for (vertex v : v in graph G) { |
if (!visited[v]) { | if (!visited[v]) { | ||
dfs(v); | dfs(v); | ||
Строка 27: | Строка 27: | ||
} | } | ||
− | dfs(u) { | + | dfs(vertex u) { |
visited[u] = true; | visited[u] = true; | ||
− | for ( | + | for (vertex v : exists edge uv) { |
if (!visited[v]) { | if (!visited[v]) { | ||
dfs(v); | dfs(v); |
Версия 08:14, 25 октября 2011
Топологическая сортировка ориентированного ациклического графа представляет собой такое линейное упорядочение всех его вершин, что если , то при таком упорядочении располагается до (если граф не является ациклическим, такая сортировка невозможна).
Постановка задачи
Теорема: | |||||
— ациклический ориентированный граф, тогда | |||||
Доказательство: | |||||
Определим алгоритма dfs. Рассмотрим функцию . Очевидно, что такая функция подходит под критерий функции из условия теоремы, если выполняется следующее утверждение: как порядковый номер окраски вершины в черный цвет в результате работы
| |||||
Алгоритм
Из определения функции
мгновенно следует алгоритм топологической сортировки:doTopSort(graph G) { fill(visited, false); time = 0; for (vertex v : v in graph G) { if (!visited[v]) { dfs(v); } } }
dfs(vertex u) { visited[u] = true; for (vertex v : exists edge uv) { if (!visited[v]) { dfs(v); } } topSortAnswer[u] = n - time++; }
Время работы этого алгоритма соответствует времени работы алгоритма поиска в глубину, то есть равно
.Источники
- Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы: построение и анализ, второе издание. Пер. с англ. — Издательский дом "Вильямс", 2007. — 1296 с. — Глава 22. Элементарные алгоритмы для работы с графами.