Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
X
- •ПРЕДИСЛОВИЕ
- •1.1. Основные понятия и обозначения
- •1.2. Битовая шкала множества
- •2.3. Бинарные коды Грея
- •2.4. Порядок выполнения задания
- •1.4. Отношения над множествами
- •1.5. Расстояние между множествами
- •1.6. Порядок выполнения задания
- •1.7. Варианты
- •2.1. Формулировка задачи
- •2.2. Счет в двоичной системе счисления
- •2.5. Варианты
- •3.1. Определение комбинаторных объектов
- •3.2. Генерация сочетаний
- •3.3. Генерация перестановок
- •3.4. Порядок выполнения задания
- •3.5. Варианты
- •ГЛАВА 2. АЛГОРИТМЫ НА ГРАФАХ
- •4.1. Основные понятия и обозначения
- •4.2. Отношения и операции
- •4.3. Родственные графам объекты
- •4.4. Способы машинного представления
- •4.5. Порядок выполнения задания
- •4.6. Варианты
- •5.1. Обход вершин графа в глубину или ширину
- •5.2. Базовые задачи на графах
- •5.3. Порядок выполнения задания
- •5.4. Варианты
- •6.1. Формулировка задачи
- •6.2. Алгоритм Краскала
- •6.3. Алгоритм Прима
- •6.4. Некоторые замечания
- •6.5. Порядок выполнения задания
- •6.6. Варианты
- •7.1. Формулировка задачи
- •7.5. Кратчайшие контуры и транзитивное замыкание
- •7.6. Порядок выполнения задания
- •7.7. Варианты
- •ГЛАВА 3. АЛФАВИТНОЕ КОДИРОВАНИЕ
- •8.1. Основные понятия и обозначения
- •8.2. Формулировка задачи
- •8.3. Критерии однозначного декодирования
- •8.4. Порядок выполнения задания
- •8.5. Варианты
- •9.1. Средняя длина элементарного кода
- •9.2. Формулировка задачи
- •9.3. Свойства оптимальных кодов
- •9.4. Алгоритм Хаффмена
- •9.5. Сжатие текстов
- •9.6. Порядок выполнения задания
- •9.7. Варианты
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •АЛФАВИТНЫЙ УКАЗАТЕЛЬ
- •ОГЛАВЛЕНИЕ

4.3. Родственные графам объекты
Иногда введенное определение графа оказывается недостаточным, и приходится рассматривать более общие объекты: мультиграф,
псевдограф, орграф.
Мультиграф – это граф, в котором допускаются кратные ребра,
Е является не множеством, а семейством элементов из V
т. е.
В
псевдографе кроме кратных ребер допускаются еще петли
(2)
.
−
ребра, соединяющие вершину саму с собой.
ориентированных графов (или орграфов) множество V
Для
заменяется декартовым квадратом
ченных пар (
u, v) элементов множества V. Итак, орграф – пара
2
V
= V × V, состоящим из упорядо-
(2)
G = (V, E) , где V – множество вершин, Е – множество ориентирован-
ных ребер, которые называются
то вершины
u и v называются ее началом и концом соответственно. На
дугами, Е ∈ V
2
. Если е = (u, v) – дуга,
рисунке дуги принято отмечать стрелками, указывающими направление от начала к концу дуги. Для орграфов цепь называется
а цикл –
контуром. Другая терминология применяется и в отношении
степеней вершин. Число дуг, исходящих из вершины
путем,
v, называется
полустепенью исхода, а входящих – полустепенью захода. Обознача-
ются эти числа, соответственно,
−
d
(v) и d
+
(v).
Для орграфов справедливы все определенные ранее отношения
и операции над неориентированными графами. Однако если полный
неориентированный граф порядка
полный орграф того же порядка имеет
та вычисляется
дополнение орграфа.
n имеет m = n (n – 1) / 2 ребер, то
2
m = n
дуг. С учетом этого фак-
4.4. Способы машинного представления
Изображение графов на плоскости в виде точек и соединяющих
их линий является наиболее понятным для человека способом представления графов. Однако если требуется решать с помощью ЭВМ
задачи, связанные с графами, то данный способ становится бесполезным. Его в лучшем случае можно использовать для внешнего представления входных и выходных
данных алгоритмов.
41

Известны различные способы машинного представления графов, которые различаются объемом занимаемой памяти и скоростью
выполнения операций над графами. Рассмотрим из них четыре основных [11].
Способ 1. Матрица инцидентности. Это классический матричный способ представления графа. Пусть
(
n, m)-граф, V = {1, …, n}, n ≥ 2, E = {e
инцидентности
зывается (
графа G c заданной нумерацией вершин и ребер на-
n × m)-матрица A(G) = {a
}, элементы которой определяются
ij
G = (V, E) – помеченный
, …, em}, m ≥ 1. Матрицей
1
следующим образом:
⎧
=
a
⎨
ji
⎩
ei
j
==
,ребру инцидентна вершина если,1
).,...,1;,...,1( случае противном в0
mjni
Для орграфов определение матрицы инцидентности видоизменяется:
, дуги концом является вершина если,1
⎧
⎪
−=
a
⎨
ji
⎪
⎩
Если орграф имеет петли, т. е. дуги вида е
договариваются обозначать a
= 2, хотя возможны и другие соглаше-
ij
= (i, i), то их обычно
j
ei
j
, дуги началом является вершина если,1
ei
j
==
mjni
).,...,1;,...,1( случае противном в0
ния.
Матрица инцидентности пригодна для представления мультиграфов и псевдографов.
Пример 4.3. Пусть заданы граф G
, орграф G2 (рис. 4.2, 4.3).
1
Соответствующие им матрицы инцидентности приведены на рис. 4.4,
4.5.
1
2
1
e
2
2
e
1
e
4 3
G1
Рис. 4.2 Рис. 4.3
e3
e
2
4
e3
e1
4 3
e4
G2
e5
e
6
42

0011
⎛
⎜
⎜
=
(
)
GA
1
⎜
⎜
⎜
⎝
⎞
⎟
0100
⎟
1110
⎟
1001
⎟
⎟
0000
⎠
=
(
)
GA
2
−
⎛
⎜
⎜
⎜
⎝
−−
0 0 0 0 11
⎞
−
⎟
1 10 1 1 0
⎟
−
11 0 0 0 0
⎟
0 0 2 10 1
⎠
Рис. 4.4 Рис. 4.5
С алгоритмической точки зрения, матрица инцидентности как
способ задания графов имеет ряд существенных недостатков. Вопервых, требуется для (n, m)-графа nm ячеек памяти, причем большинство из них будет занято нулями. Во-вторых, неудобен доступ к данным. Ответы на элементарные вопросы типа «Существует ли дуга
(u, v)?», «Какие
вершины смежны с вершиной v?» требуют в худшем
случае перебора всех столбцов матрицы. В-третьих, матрица инцидентности непригодна для представления взвешенных графов.
Способ 2. Матрица смежности.
Пусть G = (V, E) – помеченный
граф порядка n ≥ 1, V = {1, …, n}. Матрицей смежности графа G c
заданной нумерацией вершин называется (n × n)-матрица B(G) = {b
},
ij
элементы которой определяются следующим образом:
⎧
=
b
⎨
ji
⎩
ji
=
,смежны и вершины если,1
).,...,1,( случае противном в0
nji
Всякий орграф G = (V, E) можно также задать матрицей смеж-
b
ij
=
ji
}, где
⎧
⎨
⎩
∈
Eji
=
,),( если,1
).,...,1,( случае противном в0
nji
ности B(G) = {b
Если в орграфе есть петли, т. е. дуги вида (i, i), то для них, как правило, полагают b
Пример 4.4. Матрицы смежности для графа G
ii
= 1.
и орграфа G2,
1
(рис. 4.2, 4.3) указаны на рис. 4.6, 4.7.
43

01100
⎛
⎜
Рис. 4.6 Рис. 4.7
⎜
=
(
)
GB
1
⎜
⎜
⎜
⎝
⎞
⎟
00100
⎟
01011
⎟
00101
⎟
⎟
00000
⎠
(
⎛
⎜
⎜
)
GB
=
⎜
2
⎜
⎜
⎝
⎞
0010
⎟
⎟
0100
⎟
0010
⎟
⎟
1011
⎠
Неориентированные графы всегда имеют симметричные матри-
цы смежности.
Главным преимуществом матрицы смежности является то, что
за один шаг можно получить ответ на вопрос «Существует ли в графе
ребро{u, v}?». Другими словами, матрица смежности обеспечивает
«прямой доступ» к ребрам графа. Недостаток данного способа представления графа – это большая
потребность в памяти: нужно n2 ячеек.
Для взвешенных графов и орграфов вместо матриц смежности
используют матрицы весов. Пусть G = (V, E) – помеченный граф, для
которого V = {1, …, n}, w(i, j) – вес ребра {i, j} ∈ E. Матрицей весов
графа G называется (n × n)-матрица W(G) = {w
}, элементы которой
ij
определяются формулой
∈
⎧
=
w
⎨
ji
⎩
Ejijiw
=
,},{ если),,(
nji
).,...,1,( случае противном в0
Аналогично определяется матрица весов для орграфа.
Способ 3. Перечень ребер. Данный способ является наиболее
экономичным в отношении памяти (особенно для разреженных гра-
2
фов, когда m гораздо меньше n
). Он предполагает задание графа
G = (V, E) с помощью последовательности пар < u, v >. Пара < u, v >
соответствует ребру {u, v}∈ E, если граф неориентированный, или дуге (u, v) ∈ E, если ориентированный. Поскольку пару < u, v > можно
хранить, используя две ячейки (по одной на каждую концевую верши-
то для хранения всей последовательности пар достаточно 2m яче-
ну),
ек. Если граф взвешенный, то понадобится еще m ячеек для хранения
весов ребер (дуг) графа.
44

Этот способ также не лишен недостатков. Во-первых, чтобы определить, содержит ли граф заданное ребро, надо посмотреть в худшем случае все элементы последовательности, т. е. выполнить 2m элементарных операций. Ситуацию можно несколько улучшить, предварительно упорядочив пары < u, v > лексикографически, и затем
применить двоичный поиск. Во-вторых,
если граф G = (V, E) имеет
изолированные вершины, то необходимо хранить множество V вершин
графа G = (V, E), а это еще n дополнительных ячеек памяти.
Пример 4.5. Перечни ребер для графа G
и орграфа G
1
(рис. 4.2, 4.3) представлены на рис. 4.8, 4.9 соответственно.
1 3 1 2
1 4 2 3
2 3 3 2
3 4 4 1
4 2
4 4
Рис. 4.8 Рис. 4.9
Способ 4. Списки смежности. При таком способе задания графа
G = (V, E) каждой вершине i ∈ V ставится в соответствие ее окрестность
в виде списка N
массив М = (М
хранится указатель на первый элемент списка Ni (i = 1, …, n).
в M
i
вершин, смежных с ней. Кроме того, формируется
i
, …, Мn) указателей на списки смежности вершин, т. е.
1
Примечательно, что каждое ребро {i, j} неориентированного
графа представляется дважды: через вершину i в списке N
вершину j в списке N
. Поэтому для неориентированного (n, m)-графа
j
и через
i
требуется 4m + n ячеек памяти, а для ориентированного – только
2m + n. Для проверки условия, содержит ли граф заданное ребро, не-
обходимо выполнить порядка n элементарных операций.
Очевидно, что данный способ применим также для взвешенных
графов и орграфов.
2
45

M
Пример 4.6. Списки смежности для графа G
и орграфа G2
1
(рис. 4.2, 4.3) изображены на рис. 4.10, 4.11 соответственно.
М
1
3
nil
2
3
3
nil
1
2
4nil
4
1
34nil
5
nil
Рис. 4.10
M
М
2
1
nil
2
3
nil
2
3
4
nil
4
1
2
nil
Рис. 4.11
Выбор того или иного способа представления графа зависит
от конкретной задачи. Нередки случаи, когда в программе необходимо
перейти от одного способа представления графа к другому.
46

4.5. Порядок выполнения задания
4.5.1. Разработать алгоритм и программу перехода от способа A
представления графа к способу В. Номер варианта задания определяет
значения А и В (табл. 4.1). Оценить вычислительную сложность разработанного алгоритма.
4.5.2. Разработать алгоритм и программу проверки отношений и
выполнения операций над графами. Отношения и операции определяются номером варианта задания (табл. 4.1). Считать,
исходных данных выступают один или два графа в зависимости
от варианта задания. Исходные графы заданы и вводятся перечнями
их вершин и ребер. Графы могут быть неориентированными и ориентированными. Для представления графов в памяти ЭВМ взять способ
В. Тестовые примеры придумать самостоятельно. Оценить сложность
алгоритма и программы по
времени и используемой памяти.
что в качестве
4.6. Варианты
Таблица 4.1
Номер
варианта
1 1 2 Операция объединения
2 1 3 Отношение включения
3 2 3 Операция дополнения
4 2 4 Отождествление двух заданных
5 3 4 Удаление заданной вершины
6 1 4 Отношение равенства
Способ
представления графа
А В
Отношения и операции
над графами
вершин
Удаление заданного ребра
47

ЗАДАНИЕ 5
Базовые задачи и алгоритмы на графах
Во многих задачах теории графов необходимо обойти некоторый граф, посещая каждую его вершину в точности один раз и выполняя при этом некоторую систематическую обработку информации,
относящуюся к этой вершине. К таким задачам относятся: отыскание
остовного дерева; распознавание связности, двудольности и ацикличности графа; поиск «узких» мест графа; проверка достижимости
шин и др. Все эти задачи и алгоритмы их решения составляют операционный базис теории графов. Изучение методов систематического
перебора вершин графа и практика решения на компьютере базовых
задач теории графов – цель данного задания.
5.1. Обход вершин графа в глубину или ширину
Среди различных методов систематического обхода всех вершин
графа наиболее известны поиск в глубину и поиск в ширину [5, 6, 12−19].
Алгоритмы поиска лежат в основе многих задач на графах.
В алгоритме 5.1, реализующем обход вершин графа в глубину
или ширину, предполагается, что граф G = (V, E), где V = {v
n ≥ 1, задан списками смежности. Это означает, что для каждой вершины v ∈ V известна ее окрестность N(v). Обход начинается с вершины s ∈ V, которая также должна быть задана.
вер-
, …, vn},
1
Алгоритм 5.1. Поиск в глубину или ширину
1. Инициализация. Пусть Х – одномерный массив для записи меток
вершин графа. Вначале все вершины графа считать неотмеченными: для каждой вершины v ∈ V положить Х[v]:= 0.
Начало обхода. Исходную вершину s записать в структуру
2.
данных Q и отметить, полагая X[s]:= 1.
Посещение вершины. Из Q извлечь вершину u и вывести ее
3.
в качестве очередной пройденной вершины.
48

4.
∑
Пополнение Q. Проанализировать каждую вершину ω ∈ N(u).
Если X[ω] = 0, т. е. вершина ω еще не отмечена, то записать ее
в Q и отметить, полагая X[ω]:= 1.
5.
Продолжение или завершение обхода. Если Q ≠ ∅, то перейти
к пункту 3. Иначе обход завершить.
Если структура данных Q – стек (удаление и добавление эле-
ментов производится с одного конца), то обход вершин графа по алгоритму 5.1 соответствует поиску в глубину. Поиск в глубину называют
иногда обходом в вертикальном порядке. Если Q – очередь (удаление
элементов производится с одного конца, а добавление – с другого), то
обход называется поиском в ширину, или обходом в горизонтальном
порядке.
Для связного графа G алгоритм 5.1 обеспечивает обход всех
вершин графа, поскольку в Q попадают по порядку все вершины из
множества
N(v1) ∪ … ∪ N(vn) = V.
При этом каждая вершина обходится только один раз. Действительно,
посещаются только те вершины, которые попали в Q (пункт 3 алгоритма). В Q записываются только неотмеченные вершины, которые
сразу же отмечаются (пункт 4 алгоритма).
Оценим сложность алгоритма 5.1. Каждое включение и ис-
ключение вершины из Q выполняется за время О (1). Поэтому для
всей работы, связанной с изменением Q, достаточно времени О (n),
где n = | V |. Для каждой вершины u ∈ V пункт 4 алгоритма выполняется d(u) = | N(u) | раз. Поэтому затраты на его выполнение в целом
можно оценить так:
⎛
⎜
⎝
⎞
∑
∈
=
⎟
Vu
⎠
),()( mOudO
где m = | Е | – число ребер графа. Таким образом, временная сложность
поиска в глубину или ширину составляет O (n + m). Заметим, что здесь
использовано равенство
∈
,2)( mudVu=
справедливое для любого (n, m)-графа G = (V, E) и известное в теории
графов как «лемма о рукопожатиях».
49

Пример 5.1. Рассмотрим (7, 10)-граф G = (V, E), для которого
V = {1, 2, 3, 4, 5, 6, 7} (рис. 5.1). При поиске в глубину вершины этого
графа будут проходиться в следующем порядке: 1, 5, 7, 6, 4, 3, 2. Обход начинается с вершины s = l.
2
1
N(1) = (2, 3, 5)
N(2) = (1, 4, 5)
N(3) = (1, 5)
4
5
3
N(4) = (2, 5)
N(5) = (1, 2, 3, 4, 6, 7)
N(6) = (5, 7)
7
6
N(1) = (5, 6)
Рис. 5.1
На рис. 5.2 и в табл. 5.1 приведены результаты обхода: ПГ-
номера (номера по порядку поиска в глубину) вершин; метки (исходные номера) вершин; текущее состояние стека Q.
Таблица 5.1
7* 1*
5*
2*
6*
4*3*
Вершина u
ПГ-номер Метка
1*
2*
3*
4*
5*
6*
7*
1
5
7
6
4
3
2
Стек Q
2, 3, 5
2, 3, 4, 6, 7
2, 3, 4, 6
2, 3, 4
2, 3
2
∅
Рис. 5.2
При поиске в ширину для s = 1 вершины будут проходиться
в следующем порядке: 1, 2, 3, 5, 4, 6, 7. На рис. 5.3 и в табл. 5.2 указаны результаты этого обхода: ПШ-номера (номера по порядку поиска
в ширину) вершин; метки вершин; текущее состояние очереди Q.
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
