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

13.3. Пересечения графа 607

13.3 Пересечения графа

Греческая мифология говорит о тщательно продуманном лабиринте, который был построен, чтобы предоставить понедельнику помещение - strous Minotaur, который был быком части и человеком части. Этот лабиринт был так сложен, что ни животное, ни человек не могли избежать его. Никакой человек, то есть, пока греческий герой, Тесей, с помощью дочери короля, Ариадн, не решил осуществить пересекающийся графом алгоритм. Тесей закрепил шар нити к двери лабиринта и раскрутил его, когда он пересек проходы скручивания в поисках понедельника - ster. Тесей, очевидно, знал о хорошем дизайне алгоритма, потому что, после нахождения и нанесения поражения животного, Тесей легко следовал за последовательностью назад из лабиринта к любящим рукам Ариадн. Формально, пересечение - систематическая процедура исследования графа, исследуя все его вершины и края.

13.3.1 Глубина сначала ищет

Первый пересекающийся алгоритм, который мы рассматриваем в этой секции, является глубиной сначала ищет (DFS)

в ненаправленном графе. Первый поиск глубины полезен для тестирования многой опоры - erties графов, включая то, есть ли путь от одной вершины до другого и связан ли граф.

Глубина сначала ищет в ненаправленном графе G, походит на блуждание в лабиринте с последовательностью и банкой краски без того, чтобы теряться. Мы начинаем в определенной стартовой вершине s в G, который мы инициализируем, фиксируя один конец нашей последовательности к s и рисуя s, как «посещается». Вершина s является теперь нашей «текущей» вершиной - называют нашу текущую вершину u. Мы тогда пересекаем G, считая (произвольный) край (u, v) инцидентом к текущей вершине u. Если край (u, v) уже приводит нас к посещенный (то есть, окрашенный) вершина v, мы немедленно возвращаемся к вершине u. Если, с другой стороны, (u, v) приводит к непосещаемой вершине v, то мы разворачиваем нашу последовательность и идем в v. Мы тогда рисуем v, как «посещается» и делаем его текущей вершиной, повторяя вычисление выше. В конечном счете мы становимся к «тупику», то есть, текущая вершина u таким образом, что весь инцидент краев на u приводит к вершинам, которые уже посещают. Таким образом взятие любого инцидента края на u заставляет нас возвращаться к u. Чтобы выйти из этого тупика, мы понижаем нашу последовательность до прежнего уровня, возвращаясь вдоль края, который принес нам к u, возвращаясь к ранее посещаемой вершине v. Мы тогда делаем v нашей текущей вершиной и повторяем вычисление выше для любого инцидента краев на v, на который мы не посмотрели прежде. Если все края инцидента v приводят к посещаемым вершинам, то мы снова свертываем нашу последовательность и отступление к вершине, от которой мы приехали добраться до v и повторить процедуру в той вершине. Таким образом мы продолжаем возвращаться вдоль пути, который мы проследили до сих пор, пока мы не находим вершину, у которой есть все же неизведанные края, возьмите один такой край и продолжите пересечение. Процесс заканчивается, когда наше возвращение приводит нас обратно к вершине начала s, и на s больше нет неизведанного инцидента краев.