Использование обхода в глубину для топологической сортировки — различия между версиями
Glukos (обсуждение | вклад) |
Glukos (обсуждение | вклад) |
||
| Строка 11: | Строка 11: | ||
Рассмотрим произвольное ребро <tex>(u, v)</tex>, исследуемое процедурой <tex>dfs</tex>. При исследовании вершина <tex>v</tex> не может быть серой, так как серые вершины в процессе работы <tex>dfs</tex> всегда образуют простой путь в графе, и факт попадания в серую вершину <tex>v</tex> означает, что в графе есть цикл из серых вершин, что противоречит условию утверждения. Следовательно, вершина <tex>v</tex> должна быть белой либо черной. Если вершина <tex>v</tex> — белая, то она становится потомком <tex>u</tex>, так что <tex>leave[u] > leave[v]</tex>. Если <tex>v</tex> — черная, значит, работа с ней уже завершена и значение <tex>leave[v]</tex> уже установлено. Поскольку мы все еще работаем с вершиной <tex>u</tex>, значение <tex>leave[u]</tex> еще не определено, так что, когда это будет сделано, будет выполняться неравенство <tex>leave[u] > leave[v]</tex>. Следовательно, для любого ребра <tex>(u, v)</tex> ориентированного ациклического графа выполняется условие <tex>leave[u] > leave[v]</tex>. | Рассмотрим произвольное ребро <tex>(u, v)</tex>, исследуемое процедурой <tex>dfs</tex>. При исследовании вершина <tex>v</tex> не может быть серой, так как серые вершины в процессе работы <tex>dfs</tex> всегда образуют простой путь в графе, и факт попадания в серую вершину <tex>v</tex> означает, что в графе есть цикл из серых вершин, что противоречит условию утверждения. Следовательно, вершина <tex>v</tex> должна быть белой либо черной. Если вершина <tex>v</tex> — белая, то она становится потомком <tex>u</tex>, так что <tex>leave[u] > leave[v]</tex>. Если <tex>v</tex> — черная, значит, работа с ней уже завершена и значение <tex>leave[v]</tex> уже установлено. Поскольку мы все еще работаем с вершиной <tex>u</tex>, значение <tex>leave[u]</tex> еще не определено, так что, когда это будет сделано, будет выполняться неравенство <tex>leave[u] > leave[v]</tex>. Следовательно, для любого ребра <tex>(u, v)</tex> ориентированного ациклического графа выполняется условие <tex>leave[u] > leave[v]</tex>. | ||
}} | }} | ||
| + | Таким образом, теорема доказана. | ||
}} | }} | ||
| + | |||
| + | == Алгоритм == | ||
| + | Из определения функции <tex>\varphi</tex> мгновенно следует алгоритм топологической сортировки: | ||
| + | |||
| + | 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++; | ||
| + | } | ||
Версия 05:12, 25 октября 2011
Топологическая сортировка ориентированного ациклического графа представляет собой такое линейное упорядочение всех его вершин, что если , то при таком упорядочении располагается до (если граф не является ациклическим, такая сортировка невозможна).
Постановка задачи
| Теорема: | |||||
— ациклический ориентированный граф, тогда | |||||
| Доказательство: | |||||
|
Определим как порядковый номер окраски вершины в черный цвет в результате работы алгоритма , см. Обход в глубину, цвета вершин. Рассмотрим функцию . Очевидно, что такая функция подходит под критерий функции из условия теоремы, если выполняется следующее утверждение:
| |||||
Алгоритм
Из определения функции мгновенно следует алгоритм топологической сортировки:
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++;
}