Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
Таблица 5.2
2'
2'
5'
5'
4'
4'
7'
7'
Рис. 5.3
1'
1'
3'
3'
6'
6'
Вершина u
ПШ-номер Метка
1' 2' 3' 4' 5' 6' 7'
1 2 3 5 4 6 7
Очередь Q
2, 3, 5 3, 5, 4 5, 4 4, 6, 7 6, 7 7

5.2. Базовые задачи на графах

Поиск в глубину или ширину лежит в основе алгоритмов реше-
ния большого числа задач, сформулированных на языке теории гра­фов. Рассмотрим основные задачи, укажем особенности их решения с помощью алгоритма 5.1.
Задача выделения компонент связности графа. Эта задача мо-
жет быть решена с помощью поиска в глубину или ширину. Пусть поиск начат с вершины s V. После его окончания, т. е. выделения компонен­ты связности, содержащей вершину s, следует проверить, все ли вер­шины графа отмечены. Если все вершины отмечены, то процесс обхода завершить. Если нет шины. Не представляет труда в алгоритме 5.1 предусмотреть вычисле­ние числа k(G) компонент связности исходного графа G и вывод сооб­щения о начале обхода вершин i-й компоненты, 1 i k(G).
, то обход возобновить с любой неотмеченной вер-
Задача распознавания связности графа. Это частный случай
предыдущей задачи. Если после однократного применения к графу алгоритма 5.1 все его вершины оказались отмеченными, то граф свя­зен. В противном случае граф не является связным.
Задача распознавания дерева. Решение задачи сводится к про-
верке связности графа и подсчету числа ребер в нем. Напомним, что если исходный (n, m)-граф связен и m = n – 1, то он является деревом [16].
51
Задача отыскания остовного дерева. Пусть G = (V, E) – связ-
ный граф и T – остовной его подграф. Если T – дерево, то его называют
остовным (или стягивающим) деревом графа G. Очевидно, что для каждого связного графа всегда существует остовное дерево: разрушая циклы, т. е. удаляя «лишние» ребра, всегда можно получить остовное дерево. Известно, что число «лишних»
ребер в связном (n, m)-графе G равно λ(G) = mn + 1, где λ(G) – цикломатическое число графа G. В общем случае цикломатическое число графа G с k = k(G) компо­нентами связности выражается формулой
λ(G) = mn + k.
Легко доказать, что граф ацикличен тогда и только тогда, когда
G) = 0 [16].
λ(
Очевидно, что при k(G) > 1 не существует остовного дерева. Ес­ли граф G помечен и является деревом, то он имеет единственное ос­товное дерево T, совпадающее с самим графом G. В общем случае вся­кий связный помеченный граф имеет, как правило, несколько различ­ных остовных деревьев. Некоторые из них
можно найти, используя
поиск в глубину или ширину.
Для построения остовного дерева алгоритм 5.1 необходимо мо­дифицировать следующим образом:
– дополнительно к массиву Х меток вершин надо формировать
одномерный массив Y длины n = |
|. Для каждой вершины
V
графа запоминать в Y непосредственно предшествующую ей вершину. Так, в пункте 4 следует полагать Y[ω]:= u, если ω – неотмеченная вершина из N(u), а в пункте 2 для начальной вершины s установить Y[s]:= 0;
– в пункте 3, извлекая из Q всякую отличную от s вершину u,
создавать и выводить ребро
{u, v}, где v = Y[u]. Совокупность
всех таких n – 1 ребер и образует остовное дерево.
Пример 5.2.
Для графа G из примера 5.1 поиск в глубину из вер­шины 1 дает остовное дерево, изображенное на рис. 5.4. В табл. 5.3 приведены состояния массива Y после обхода вершин для этого де­рева.
52
Таблица 5.3
21
4
5
7
3
6
Вершина
ω
1 2 3 4 5 6 7
Вершина u
предшественница
для ω
0 1 1 5 1 5 5
Рис. 5.4
Из рис. 5.4 видно, что при построении остовного дерева исход­ный граф G теряет 4 ребра (они отмечены пунктирными линиями). Это соответствует значению цикломатического числа λ(G) = 10 – 7 + 1 = 4 графа G, для которого m = 10, n = 7, k = 1.
Задача отыскания остовного леса.
Пусть G = (V, E) – произ­вольный граф, связный или несвязный. Всякий остовной ациклический подграф T графа G называется его остовным (или стягивающим) лесом. Очевидно, что остовной лес (n, m)-графа с k = k(G) компонен­тами связности определяется через остовные деревья этих компонент и, следовательно, содержит m = n – k
ребер. Таким образом, задача отыскания остовного леса сводится к выделению компонент связности и нахождению для каждой из компонент остовного дерева. Все это можно реализовать с помощью поиска в глубину или ширину.
Задача проверки существования в графе G = (V, E) цикла, про-
ходящего через заданное ребро e = {a, b}
E. Проверка этого условия
эквивалентна проверке наличия (a, b)-цепи в графе G – e. Последнее можно выполнить, применяя поиск в глубину или ширину из вершины a. Если вершины a и b принадлежат одной и той же компоненте связности графа Ge, то в графе G существует цикл, проходящий через ребро
, b}, в противном случае такой цикл не существует.
e = {a
Задача поиска «узких» мест графа. Вершина v графа G на-
зывается точкой сочленения (или разделяющей вершиной), если граф
53
Gv имеет больше компонент связности, чем G. В частности, если G связен и v – точка сочленения этого графа, то G v не связен. Анало­гично ребро графа называется мостом, если его удаление увеличивает число компонент связности. Таким образом, точки сочленения и мосты – это своего рода «узкие» места графа.
Заметим,
что в дереве все вершины, кроме висячих, являются
точками сочленения, а все ребра мостами. Очевидно, что концевая вершина моста является точкой сочленения, если она не является ви­сячей, т. е. в графе есть другие ребра, инцидентные этой вершине.
Пример 5.3. Граф, изображенный на рис. 5.1, имеет одну точку
сочленения – вершину с номером 5. Мостов в этом графе нет.
Поиск «узких» мест графа сводится к задаче выделения компо­нент связности. Действительно, удаляя поочередно вершины (ребра) графа и каждый раз вычисляя число компонент в полученном графе, можно найти все точки сочленения (мосты) исходного графа
G.
Задача распознавания блока. Связный граф без точек сочле-
нения называют блоком. Блоки играют важную роль в теории графов. Ряд задач достаточно уметь решать для блоков. Решение задачи распо­знавания блоков сводится к проверке связности графа и наличия в нем точек сочленения.
Задача распознавания двудольности графа. Граф G = (V, E)
называется двудольным, если существует такое разбиение множества его вершин V на две доли V
и V2 (V1 V2 = V, V1 V2 = ), что концы
1
каждого ребра е Е принадлежат разным долям. Если G – двудольный граф, то пишут G = (V который содержит все ребра, соединяющие множества V
| = р, |V2| = q, то полный двудольный граф обозначается Kpq.
|V
1
, V2, E). Полный двудольный графэто граф,
1
и V2. Если
1
Необходимые и достаточные условия двудольности графа уста­навливает теорема Кенига [14, 16]: граф двудольный тогда и только тогда, когда в нем нет циклов нечетной длины. По теореме Кенига все ациклические графы двудольные.
Пример 5.4. Граф из примера 5.1 не является двудольным, так как
он содержит циклы, некоторые из которых имеют длину 3 и 5 (рис. 5.1).
Теорема Кенига подсказывает простой способ распознавания двудольности графа, основанный на поиске в глубину или ширину. Не
54
ограничивая общности, будем полагать, что исходный граф G = (V, E) связен, поскольку каждую компоненту связности можно рассматри­вать отдельно, ибо дизъюнктное объединение двудольных графов яв­ляется двудольным графом.
Вначале с помощью алгоритма 5.1 необходимо множество вер­шин исходного графа разнести по уровням. Здесь номер уровня вер­шины v – это расстояние от
начальной вершины s до вершины v, т. е. длина кратчайшей по числу ребер (s, v)-цепи. Для этого алгоритм 5.1 следует модифицировать следующим образом:
– дополнительно к массиву Х меток вершин создать одномер-
ный массив Y, в который записывать для каждой вершины графа непосредственно предшествующую ей вершину. В пункте 4 элемент Y[ω]
полагать равным u, если ω – неот­меченная вершина из N(u), а в пункте 2 для начальной вер­шины s установить Y[s]:= 0;
– создать одномерный массив Z, в котором формировать для
каждой вершины номер уровня. С этой целью в пункте 3, из­влекая из Q всякую отличную от s вершину u, полагать
v:= Y[u], Z[u]:= Z[v] + 1.
Это означает, что номер уровня вершины u на единицу выше уровня её предшественницы – вершины v.
Таким образом, после завершения систематического обхода всех вершин графа каждая из них будет отнесена к некоторому уровню. Далее множество вершин V необходимо разбить на доли V
и V2:
1
все вершины с четными номерами уровней записать в V
все остальные вершины отнести к V
.
2
;
1
Критерий двудольности такой: если любые две несовпадающие вершины из одной доли не являются смежными, то G = (V
, V2, E) – дву-
1
дольный граф. Вообще достаточной является проверка отношения смеж­ности для всех пар вершин с одинаковыми номерами уровней (почему?).
Пример 5.5. Рассмотрим граф G из примера 5.1. Для него поиск
в глубину из вершины 1 дает остовное дерево (рис. 5.4) и разносит вершины графа по трем уровням (рис. 5.5). Номера уровней на рис. 5.5
55
указаны в скобках. Поскольку существуют пары смежных в G вер­шин с одинаковыми номерами уровней, то рассматриваемый граф не является двудольным.
21
2(1)
5(1)
4(2) 3(1)
4
5
1(0)
3
7(2)
7
Рис. 5.5
6(2)
6
Задача о достижимости вершин орграфа. Пусть заданы орг-
раф G = (V, E) и некоторая его вершина s V. Требуется найти множе­ство всех вершин орграфа, достижимых из s. Говорят, что вершина v достижима из вершины s, если в G существует путь, идущий от вершины s к вершине v. Напомним, что путь – ориентированная цепь.
Данная задача
решается с помощью алгоритма 5.1. Для орграфа обход вершины следует производить с учетом направленности дуг. Направленность дуг полностью определяется списками смежности орграфа. Обход надо начинать с вершины s. Все вершины, которые удается отметить и пройти, достижимы из s.
Пример 5.6.
Пусть задан орграф G (рис. 5.6).
1
4 3
2
5
N(1) = (2)
N(2) = (3)
N(3) = (2, 5)
N(4) = (1, 2) N(1) =
Рис. 5.6
56
Требуется выяснить, какие вершины достижимы из вершины 4. На рис. 5.7 и в табл.5.4 приведены результаты обхода орграфа в глуби­ну из вершины 4: ПГ – номера вершин; метки вершин; текущее со­стояние стека Q. В результате обхода все вершины орграфа оказались отмеченными, а значит, достижимыми из вершины 4.
Таблица 5.4
5*
1* 3*
4*
Рис. 5.7
2*
Вершина u
ПГ-номер Метка
1* 2* 3* 4* 5*
4 2 3 5 1
Стек Q
1, 2 1, 3 1, 5
1
Задача нахождения всех источников орграфа. Источником
орграфа называется вершина, из которой достижимы все другие вер­шины. Нахождение всех источников орграфа сводится к перебору всех вершин и решению для каждой из них задачи о достижимости.
Задача проверки существования в орграфе G = (V, E) контура,
проходящего через заданную дугу e = (a, b)
E. Проверка этого усло-
вия равносильна проверке наличия (a, b)-пути в орграфе Ge. Эту про­верку можно выполнить, используя поиск в глубину или ширину из вершины b. Если вершина a достижима из вершины b в Ge, то в G существует контур, проходящий через дугу (a, b). Так, например,
в орг­рафе с рис. 5.6 имеется контур, проходящий через дугу (2, 3). Других контуров в этом орграфе нет.

5.3. Порядок выполнения задания

5.3.1. Изучить алгоритм 5.1. Разработать и отладить программ-
ные процедуры поиска в глубину и поиска в ширину.
5.3.2. Разработать алгоритмы и программы решения базовых задач теории графов с использованием алгоритма 5.1. Состав задач и стратегия обхода вершин определяются номером варианта задания (табл. 5.5). Оце­нить вычислительную сложность разработанных алгоритмов.
57

5.4. Варианты

Таблица 5.5
Номер
варианта
1 Выделение компонент связности
графа Достижимость вершин орграфа Поиск в ширину Отыскание остовного дерева Поиск в ширину
2 Распознавание связности Поиск в ширину
Нахождение всех источников оргра­фа
Отыскание остовного дерева Поиск в глубину
3 Распознавание дерева Поиск в ширину
Проверка существования контура, проходящего через заданную дугу
Отыскание остовного леса Поиск в глубину
4 Поиск «узких» мест графа Поиск в глубину
Проверка существования цикла, проходящего через заданное ребро
Отыскание остовного леса Поиск в ширину
5 Распознавание блока Поиск в глубину
Задача Стратегия
обхода вершин
Поиск в глубину
Поиск в глубину
Поиск в ширину
Поиск в глубину
Отыскание всех источников орграфа Поиск в ширину Распознавание двудольности графа Поиск в ширину
6 Распознавание дерева Поиск в глубину
Проверка существования цикла, проходящего через заданное ребро
Распознавание двудольности графа Поиск в глубину
58
Поиск в ширину
ЗАДАНИЕ 6
Построение минимального остова
Одной из важнейших тем, связанных с графами, традиционно счи-
таются оптимизационные задачи. В этом задании рассматривается одна из немногих быстрорешаемых оптимизационных задач на графах построе­ние минимального остова. Цель задания: изучение двух известных мето­дов решения данной задачи и их программная реализация; практика ре­шения прикладных задач, сводимых к

6.1. Формулировка задачи

Пусть задан связный взвешенный граф G = (V, E), V = {v1, …,
v
}, n 1, E = {e1, …, em}, m 1, на множестве ребер которого опреде-
n
лена весовая функция. Эта функция приписывает каждому ребру
, vj} Е графа вещественное число w(е) = w
е = {v
i
буется из конечного (возможно, очень большого) числа остовных де­ревьев заданного графа найти одно, у которого сумма весов входящих в него ребер минимальна. Это дерево называют минимальным осто- вом, а саму задачу – задачей о минимальном остове. Решение данной задачи для связного графа всегда существует и, возможно, не единст­венное.
Задача о минимальном остове возникает, например, при проек­тировании сетей коммуникаций, когда некоторые центры требуется соединить системой каналов связи так, чтобы любые два центра были достижимы друг из друга, и общая длина каналов связи была мини­мальна. В этой ситуации
центры можно считать вершинами полного графа с весами ребер, равными длинам соединяющих эти центры кана­лов. Тогда искомая сеть – минимальное остовное дерево.
Для решения задачи о минимальном остове имеются несколько эффективных алгоритмов. Рассмотрим два из них: алгоритм Дж. Крас­кала (1956 г.), алгоритм Р. Прима (1957 г.).

6.2. Алгоритм Краскала

Идея алгоритма Краскала состоит в формировании остовного дерева T путем выбора в исходном связном графе G = (V, E) ребер
минимальному остову.
вес ребра e. Тре-
ij
59
с наименьшим весом, но так, чтобы не возникал цикл. Эта «жадная» стратегия всегда дает точное решение задачи о минимальном остове.
Алгоритм 6.1. Алгоритм Краскала
1. Построить граф Т1 = On + e1 присоединением к безреберному n­вершинному графу O
2.
Если граф Т
графа T
уже построен и i < n – 1, то выполнить построение
i
= Ti + e
i + 1
минимальный вес среди ребер, не входящих в T щих циклов с ребрами из T
3.
Процесс завершить, как только будет построен граф T
ребра е1 E минимального веса.
n
i + 1
, где e
есть ребро графа G, имеющее
i + 1
.
i
и не содержа-
i
.
n − 1
Доказано [16], что граф T
является минимальным остовным
n − 1
деревом. В пункте 2 алгоритма Краскала предусмотрена проверка на­личия в графе T
i + 1
= Ti + e
цикла, проходящего через ребро e
i + 1
i + 1
. Для этого можно использовать алгоритм 5.1 поиска в глубину или ширину (см. задание 5).
Сложность поиска в глубину или ширину составляет О
|, m = | E |. Если считать, что ребра графа G = (V, E) предваритель-
n = |
V
(n + m), где
но упорядочены, то временные затраты на подсоединение m = n – 1 ре­бер к графу O убыванию весов известны алгоритмы с временем работы О
составят О (nm). Для упорядочения множества E по не-
n
(m log m)
[13]. Таким образом, реализация «жадной» стратегии приводит (неза-
висимо от способа машинного представления графа G) к алгоритму с временем исполнения О
(nm), т. е. к полиномиальному алгоритму.
Алгоритм Краскала особенно эффективен для «редких» графов гра­фов, слабо насыщенных ребрами.
Пример 6.1. Используя алгоритм Краскала, определим мини-
мальный остов графа G, изображенного на рис. 6.1 (в скобках даны веса ребер). На рис. 6.2 приведена последовательность графов Т
, Т4, Т5, получаемая в результате выполнения алгоритма Краскала.
Т
3
, Т2,
1
На рис. 6.1 минимальный остов выделен темными линиями. Суммар­ный вес ребер минимального остова составляет 19.
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]