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