Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

Глава 13. Алгоритмы графа

Пример выше мотивирует следующее определение. Позвольте G быть диграфом с n вершинами. Топологический заказ G - заказ v1..., vn вершин G, таким образом это для каждого края (vi, v j) G, я <j. Таким образом, топологический заказ

заказ таким образом, что любой направленный путь в G пересекает вершины в увеличивающемся заказе. (См. рисунок 13.11.) Отмечают, что у диграфа может быть больше чем один топологический заказ.

(a) (b)

Рисунок 13.11: Два топологических заказа того же самого нециклического диграфа.

Суждение 13.21: у G есть топологический заказ, если и только если это нециклически.

Оправдание: необходимость («только если» часть заявления) легка

продемонстрировать. Предположим, что G топологически заказан. Примите ради довода «против» -

tradiction, что у G есть цикл, состоящий из краев (vi0, vi1), (vi1, vi2)..., (vik-1, vi0). Из-за топологического заказа у нас должно быть i0 <i1 < <ik-1 <i0, который

ясно невозможно. Таким образом G должен быть нециклическим.

Мы теперь обсуждаем достаточность условия («если» часть). Предположим, что G нециклический. Мы даем алгоритмическое описание того, как построить топологический заказ для G. Так как G нециклический, у G должна быть вершина без поступающих краев (то есть, с 0 в степени). Позвольте v1 быть такой вершиной. Действительно, если бы v1 не существовал, то в отслеживании направленного пути от произвольной вершины начала мы в конечном счете столкнулись бы с ранее посещаемой вершиной, таким образом противореча acyclicity G. Если мы удаляем v1 из G, вместе с его коммуникабельными краями, получающийся диграф все еще нециклический. Следовательно, у получающегося диграфа также есть вершина без поступающих краев, и мы позволяем v2 быть такой вершиной. Повторяя этот процесс, пока диграф не становится пустым, мы получаем заказ v1..., vn вершин G. Из-за строительства выше, если (vi, v j) край G, то vi должен быть удален прежде v, j может быть удален, и таким образом я <j. Таким образом, v1... vn - топологический заказ.

Суждение 13.21's оправдание предлагает алгоритм (Кодовый Фрагмент 13.23), названный топологической сортировкой, для вычисления топологического заказа диграфа.

13.4. Направленные графы 635

Алгоритм TopologicalSort (G):

Вход: диграф G с n Продукцией вершин: топологический заказ v1..., vn G

S¬ первоначально пустой стек.

для всего u в G.vertices () делают

Позвольте incounter (u) быть в степени из u. если incounter (u) = 0 тогда

S.push (u)

i¬1

в то время как! S.empty () делают

u¬ S.pop ()

Позвольте u быть вершиной номер i в топологическом заказе.

я¬ i+1

для всех коммуникабельных краев (u, w) u делают

incounter (w)¬ incounter (w)- 1

если incounter (w) = 0 тогда

S.push (w) Кодовый Фрагмент 13.23: псевдокодекс для топологического алгоритма сортировки. (Мы показываем пример заявления этого алгоритма в рисунке 13.12.)

Суждение 13.22: Позвольте G быть диграфом с n вершинами и m краями. topolog-iCal, сортирующий алгоритм, управляет в O (n + m) временем, используя O (n) вспомогательное пространство, и или вычисляет топологический заказ G или не нумерует некоторые вершины, который indi-киты, что у G есть направленный цикл. Оправдание: начальное вычисление в степенях и установка incounter переменных могут быть сделаны с простым пересечением графа, который берет O (n + m) время. Мы используем образец декоратора, чтобы связаться, отвечают на признаки вершинами. Скажите, что вершину u посещает топологический алгоритм сортировки, когда u удален из стека S. Вершину u можно посетить только, когда incounter (u) = 0, который плие im-, что всех его предшественников (вершины с коммуникабельными краями в u) ранее посетили. Как следствие любая вершина, которая находится на направленном цикле, никогда не будет vis-ited, и любую другую вершину посетят точно однажды. Алгоритм пересекает все коммуникабельные края каждой посещаемой вершины однажды, таким образом, ее продолжительность пропорциональна числу коммуникабельных краев посещаемых вершин. Поэтому, алгоритм управляет в O (n + m) временем. Относительно космического использования заметьте, что стек S и incounter переменные, приложенные к вершинам, используют O (n) пространство.

Как побочный эффект, топологический алгоритм сортировки Кодового Фрагмента 13.23 также тесты, нециклический ли входной диграф G. Действительно, если алгоритм заканчивается, не заказывая все вершины, то подграф вершин, которые не были заказаны, должен содержать направленный цикл.