3.2. Перечисление путей на графе

При решении отдельных задач теории графов возникает необходи­мость строить пути — все или только некоторые, — соединяющие две заданные вершины графа. Очевидно, что для связных графов всегда существует хотя бы один такой путь. Построение всех путей данного вида называется перечислением путей и представляет собой, по су­ществу, полный последовательный перебор всех возможных вариантов путей, соединяющих заданные вершины. Рассмотрим соответствующий алгоритм перечисления путей.

Для реализации алгоритма все вершины графа упорядочиваются каким-либо образом (по номерам, по алфавиту или иначе). В упо­рядоченном наборе вершин графа каждая вершина имеет свой един­ственным образом определенный порядковый номер, который мы бу­дем обозначать символом «т/». Например, если все вершины графа снабжены индексами от 1 до п, то естественно упорядочить их по возрастанию индексов; при этом

Две заданные соединяемые начальную и конечную вершины будем обозначать инач и ?;кон ■ На каждом шаге алгоритма фиксируются два объекта:

1)               некоторый построенный текущий путь

Ънач = «[о] — — • • • — Ьщ

из начальной вершины ?;нач в текущую вершину графа (от­метим еще раз, что для вершины ьщ ее порядковый номер г в текущем пути может не совпадать с ее порядковым номером # ьщ во множестве вершин графа);

2)               индекс р, определяющий минимальный номер подлежащих рас­смотрению вершин на данном шаге.

На начальном шаге алгоритма (и некоторых последующих ша­гах) фиксируется «пустой» путь, не содержащий ребер и сводящийся К единственной вершине ?'нач = ?-'[о].

При работе алгоритма перечисления путей с целью достижения конечной вершины применяются две следующие основные операции: удлинение и укорачивание текущего пути.Удлинение. Для удлинения текущего пути просматриваются по порядку все вершины графа, смежные с крайней вершиной ущ теку­щего пути и не входящие в уже построенный путь (чтобы избежать повторения вершин). Просмотр начинается с номера р (это позволит избежать «зацикливания» в работе алгоритма). Если при просмотре найдена хотя бы одна вершина, то удлинение является возможным. Первая по порядку из найденных вершин (чтобы не допустить про­пуска возможных вариантов удлинения) принимается искомым про­должением текущего пути и обозначается через     Текущий путь становится на 1 ребро длиннее и принимает вид

Индекс р полагается равным 1, параметр к увеличивается на 1. Если же при просмотре не найдено ни одной подходящей вершины, то удлинение является невозможным.

Укорачивание. Если число к ребер в текущем пути больше 0, то укорачивание является возможным. Конечная вершина ущ текущего пути отбрасывается, и его новой конечной вершиной становится у^-ц- Текущий путь становится на 1 ребро короче и принимает вид

Индекс р полагается равным # +1, параметр к уменьшается на 1. Если же число ребер в текущем пути равно 0, т. е. путь не содержит ребер вообще

и сводится к одной вершине — гнач. то укорачивание является невозможным.

Например, если на графе, изображенном на рис. 3.2, фиксирован текущий путь г>4 —г>2, то операция удлинения при р — А приведет к следующему: вершины У\,У2,у3 пропускаются, поскольку имеют но­мера, меньшие р; вершина у4 игнорируется, поскольку уже входит в текущий путь; вершина позволяет осуществить требуемое удлинение и построить новый путь

Щ — «2 —

После укорачивания этого пути получим исходный путь у4 — у2, однако индекс р станет равным (#г>5+1) = 6. Дальнейшее удлинение этого пути невозможно, поскольку единственная допустимая по номеру вершина не является смежной с конечной вершиной Ь'2 пути. Алгоритм перечисления путей включает следующие пункты (шаги). (Как обычно, мы принимаем, что все пункты алгоритма выполняются

в порядке возрастания их номеров, если иное не оговорено явно и не указан другой подлежащий выполнению пункт.)

1.               Начало работы алгоритма. Построение путей начинается, есте­ственно, с начальной вершины. Полагаем

^[0] = ^нач, Р = 1, к = 0; в данный момент текущий путь является «пустым».

2.               Проверка. Если конечная вершина ьщ текущего пути совпадает с конечной вершиной ?;кон, т. е. ьщ = «кон, то очередной из путей, соединяющих г>нач и ?;КОн, построен. Запоминаем построенный путь и переходим к п. 4 к укорачиванию текущего пути. Если же ущ ф ?;кон, то переходим к п. 3 к удлинению пути.

3.               Удлинение. Если операция удлинения возможна, то проводим ее и переходим к п. 2. Если же удлинение невозможно, то переходим к п. 4.

4.               Укорачивание. Если операция укорачивания возможна, то про­водим ее и переходим к п. 3. Если же укорачивание невозможно (это означает, что все пути уже построены), то переходим к п. 5.

5.               Конец работы алгоритма.

Применим рассмотренный общий алгоритм для построения всех пу­тей, соединяющих вершину в с вершиной Н в графе, представленном на рис. 3.3. В рассматриваемом примере вершины графа удобно упоря­дочить в соответствии с их обозначениями по латинскому алфавиту; при этом

#А = 1, #С = 2, # Н = 3, #Ь = 4, #11 = 5.

Выполним подробно несколько первых шагов алгоритма перечисления путей.

— Полагаем г>р] = й, р = 1, к = 0.


               Поскольку вершина в не совпадает с конечной вершиной Н, то переходим к п. 3 алгоритма (далее будем говорить коротко «переход к п. 3»).

               Для вершины С смежными являются вершины А, Ь, Я, причем ни одна из них к текущему пути не относится. Поскольку р = 1 то минимальный допустимый номер 1 имеет вершина А, которая и является искомым продолжением. Текущий путь принимает вид в —А, индекс р полагается равным 1, параметр & —равным 1. Переход к п. 2.

               Поскольку вершина А не совпадает с конечной вершиной Н, то переходим к п. 3.

               Для конечной вершины А текущего пути смежными являются все остальные вершины графа, причем к текущему пути не относятся Н, Ь, Я. Поскольку р = 1, то минимальный допустимый номер имеет вершина Н, которая и является искомым продолжением. Текущий путь принимает вид в А — Н, индекс р полагается равным 1, параметр к — равным 2. Переход к п. 2.

               Вершина Н является конечной вершиной. Запоминаем построен­ный путь. Переход к п. 4.

               Укорачивание является возможным. Вершина Н текущего пути отбрасывается. Текущий путь принимает вид в — А, индекс р полагается равным #Н + 1 = 4, параметр & —равным 1. Переход к п. 3.

               Для вершины А смежными вершинами, не относящимися к те­кущему пути, по прежнему являются вершины Н, Ь, Я. Однако в настоящий момент (в отличие от рассмотренной выше ситуа­ции) р — 4. Поскольку # Н = 3, # Ь = 4, то теперь допустимым продолжением является вершина Ь. Текущий путь принимает вид в — А — Ь, индекс р полагается равным 1, параметр к — равным 2. Переход к п. 2 и т. д. по алгоритму.

Результаты проведенных расчетов могут быть представлены в при­веденной ниже таблице.

При составлении данной таблицы выполненные подряд операции удлинения записаны в одной строке (как, например, для первой строки в — А — Н). Если последняя вершина текущего пути совпадает с ко­нечной вершиной Н, то очередной из искомых путей найден. После укорачивания переходим на новую строку таблицы и в ней же записы­ваем результат последующего удлинения пути (если он возможен, как для второй строки С — А — Ь — Н). Отметим, что при .записи путейТекущий путь г)[0] — ищ — г)[2] — ■ • • С-А-Н

С-А-Ь~Н__________________________

в —А —Ь___________________

С-А-В.____________________________

С-А______________________________

С-Ь-А-Н__________________________

в—Ь—_____________________

О-Ь-А____________________________

С-Ь-Н____________________________

С-Ь__________________________________

С-И-А-Н__________________________

С-И-А-Ь-Н________________________

С-И-А-Ь__________________________

С-И-А____________________________

С-В._____________________________

в

в колонках букв — если только колонки не прерываются — сами буквы упорядочены по алфавиту.

Таким образом, в заданном графе существует 6 различных путей, соединяющих вершины С и Н:

в-А-Н,

в-А-Ь-Н,

в-Ь-А-Н,

в-Ь-Н,

С-Я-А-Н,

С-Я-А-Ь-Н.

Отметим, что цепей в графе, соединяющих данные вершины, бу­дет во всяком случае не меньше, чем путей, но тоже конечное число; примером может служить цепь в —А —Я —в —Ь —А —Н, не являю­щаяся путем. Количество же маршрутов будет бесконечно, поскольку в них допускается повторение и вершин, и ребер.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
25 26 27  Наверх ↑