
- •Введение
- •Глава 1. Множества, отношения и функции
- •1. Задание множества
- •2. Операции над множествами
- •3. Разбиение множества. Декартово произведение
- •4. Отношения
- •5. Операции над отношениями
- •6. Функция
- •7. Отношение эквивалентности. Фактор-множество
- •8. Отношения порядка
- •9. Вопросы и темы для самопроверки
- •10. Упражнения
- •Глава 2. Алгебраические структуры
- •1. Операции и предикаты
- •2. Алгебраическая система. Алгебра. Модель
- •3. Подалгебры
- •4. Морфизмы алгебр
- •5. Алгебра с одной операцией
- •6. Группы
- •7. Алгебра с двумя операциями. Кольцо
- •8. Кольцо с единицей
- •9. Поле
- •10. Решетки
- •11. Булевы алгебры
- •12. Матроиды
- •13. Вопросы и темы для самопроверки
- •14. Упражнения
- •Глава 3. Булевы функции
- •2. Формулы
- •3. Упрощения в записях формул
- •4. Равносильность формул
- •5. Важнейшие пары равносильных формул
- •6. Зависимости между булевыми функциями
- •7. Свойства операций штрих Шеффера, стрелка Пирса и сложения по модулю два
- •8. Элементарные суммы и произведения. Конституенты нуля и единицы
- •9. Дизъюнктивные и конъюнктивные нормальные формы
- •10. Представление произвольной булевой функции в виде формул
- •11. Совершенные нормальные формы
- •12. Полином Жегалкина
- •13. Сокращенные дизъюнктивные нормальные формы
- •14. Метод Квайна получения сокращенной д.н.ф.
- •15. Тупиковые и минимальные д.н.ф.
- •16. Метод импликантных матриц
- •17. Минимальные конъюнктивные нормальные формы
- •18. Полнота системы функций. Теорема Поста
- •21. Функциональная декомпозиция
- •22. Вопросы и темы для самопроверки
- •23. Упражнения
- •Глава 4. Элементы комбинаторики
- •1. Правило суммы для конечных множеств
- •2. Правило произведения для конечных множеств
- •3. Выборки и упорядочения
- •5. Число всевозможных разбиений конечного множества. Полиномиальная теорема
- •6. Метод включения и исключения
- •7. Задача о беспорядках и встречах
- •8. Системы различных представителей
- •9. Вопросы и темы для самоконтроля
- •10. Упражнения по комбинаторике
- •Глава 5. Теория графов
- •1. Основные типы графов
- •2. Изоморфизм графов
- •3. Число ребер графа
- •4. Цепи, циклы, пути и контуры
- •5. Связность графа. Компоненты связности
- •6. Матрица смежности
- •7. Матрицы смежности и достижимости
- •8. Критерий изоморфизма графов
- •9. Матрица инциденций
- •10. Деревья
- •11. Задача о минимальном соединении
- •12. Центры дерева
- •13. Ориентированные деревья
- •14. Эйлеровы графы
- •15. Гамильтоновы графы
- •16. Планарные графы
- •17. Задача о кратчайшей цепи между произвольными вершинами графа
- •18. Алгоритм Дейкстры нахождения кратчайших путей от заданной вершины орграфа
- •19. Потоки в сетях
- •20. Вопросы и темы для самопроверки
- •21. Упражнения
- •Список литературы

160
v x |
|
u |
|
v=u |
|
q |
|
|
|
q |
t |
|
|
|
G1 |
|
G* |
|
|
|
|
|
1 |
s |
t |
|
s |
v
|
v=u |
G2 |
G2* |
u
Рис. 5.33
Толщина планарного графа равна 1. Можно доказать, что нижняя оценка толщины t(G) графа с n вершинами определяется неравенством:
n
t(G)≥ 1+ ] ( ∑ deg(vi)-2)/(6(n-2))[,
i=1
здесь ] х[ - целая часть от х, а deg(vi) – локальная степень вершины vi, 1≤ i≤ n.
Дорога без поворотов длинна.
Английская пословица
§ 17. Задача о кратчайшей цепи между произвольными вершинами графа
Дан (неориентированный) взвешенный связный граф G(V,X). Каждому ребру х графа приписан вес (длина) (х) ребра х. В частном случае (х) может быть расстоянием между вершинами, соединенными ребром х или временем проезда по этому ребру, или стоимостью проезда по этому ребру и т.п. Длиной цепи Z(v,u), как известно, считают сумму длин ребер данной цепи.
Требуется для двух произвольных вершин v и u графа G найти цепь Z(v,u) такую, чтобы его длина была наименьшей.
Решим прежде частный случай этой задачи.
Нахождение кратчайшей цепи между произвольными вершинами в графе с ребрами единичной длины. Пусть у графа G все ребра имеют одинаковую длину, принимаемую за единицу. Будем считать, что заданы вершины v и u.
Как уже отмечено, все задачи на конечных графах можно решить простым перебором, но это громоздко и не всегда (в большинстве случаев)
161
практически осуществимо из-за большого числа вариантов. Получим метод решения указанной задачи, исключающей перебор.
Для поиска кратчайшей цепи реализуем поиск в ширину – один из базисных алгоритмов, составляющих основу многих других.
Общее правило для нахождения кратчайшей цепи в графе состоит в том, чтобы каждой вершине vj приписать индекс λj, равный длине кратчайшей цепи из данной вершины в заданную вершину u. Приписывание индексов вершинам осуществляем в следующем порядке:
1)вершине u приписывается 0;
2)всем вершинам, из которых идет ребро в вершину u, приписывается индекс 1;
3)всем вершинам, еще не имеющим индексов, из которых идет ребро
в вершину с индексом λj, приписывается индекс λj+1. Если одной и той же вершине можно приписать различные индексы, то приписываем минимально возможный индекс. Этот процесс продолжается до тех пор, пока не будет помечена заданная вершина v.
По окончании приписывания индексов индекс вершины v будет равен длине кратчайшей цепи Z(v,u). Кратчайшую цепь найдем, если будем двигаться из вершины v в направлении убывания индексов.
Нахождение кратчайшей цепи между произвольными вершинами в графе с ребрами произвольной длины. Задача приписывания вершинам графа числовых индексов немного усложняется, если ребра графа имеют произвольную длину. Усложнение вызвано тем, что цепь, содержащая наименьшее число рёбер, зачастую имеет большую длину, чем некоторые обходные цепи. Введем следующее правило приписывания числовых индексов:
1)вершине u приписывается индекс λ0=0. Для остальных вершин предварительно полагаем λi=∞ (i≠ 0).
2)ищем такое ребро (vi,vj), для которого λj-λi>µ(vi,vj), и заменяем индекс λj вершины vj новым индексом λj :=λi+µ(vi,vj) < λj.
Продолжается этот процесс замены индексов до тех пор, пока остается хотя бы одна вершина, для которой можно уменьшить λj. При этом индексы будут обладать следующим свойством. Пусть vp – произвольная вершина. При рассмотренном процессе приписывания индексов, индекс λp монотонно уменьшается. Пусть vq – последняя вершина, послужившая для его уменьшения. Тогда для любого p найдётся q такое, что: λp=λq+µ(vq,vp).
Следовательно, для произвольной вершины vp с индексом λp найдется вершина vq, соединенная ребром с vp, такая, что λp-λq=µ(vq,vp). Это свойство позволяет сформулировать правило для нахождения кратчайшей цепи.
Правило для нахождения кратчайшей цепи.
1.Приписать индексы всем вершинам, как указано ранее.
2.Пусть vn=v – заданная вершина (индекс которой получился равным
λn). Ищем вершину vp1, такую, что λn-λp1=µ(vp1,vn). Далее ищем

162
вершину vp2 такую, что λp1-λp2=µ(vp2,vp1) и т.д. до тех пор, пока не дойдем до вершины u.
Утверждаем, что цепь Z0(v,u)={vn,vp1,…,u} (длина которой равна λn) является кратчайшей. Для доказательства этого утверждения рассмотрим произвольную цепь из v в u: Z={vn,vk1,…,vks,u}. Её длина будет µ(Z). Согласно правилу расстановки индексов будут выполняться следующие неравенства:
λn-λk1≤ µ(vn,vk1);
λk1-λk2≤ µ(vk1,vk2);
………………….
λks-0≤ µ(vks,u);
Суммируя эти неравенства, получаем:
λn≤ Σµ(vi,vj)=µ(Z).
Таким образом, λn меньше или равна длине любой цепи соединяющей вершины v и u, но λn=µ(Z0), т.е. цепь Z0(v,u) обладает минимальной длиной.
Путник, дороги нет, дорогу делаешь ты. Мачадо*
§ 18. Алгоритм Дейкстры нахождения кратчайших путей от заданной вершины орграфа
Отметим, что имеется много различных алгоритмов нахождения кратчайших цепей в графе, а также кратчайших путей в орграфе. Эти алгоритмы отличаются друг от друга как числом необходимых операций (временной сложностью), так и возможностями применения. Например, алгоритм Беллмана - Форда позволяет находить кратчайшую цепь (путь) в графе (орграфе), в котором веса или длины рёбер (дуг) могут быть как положительные, так и отрицательные. Алгоритм Дейкстры более эффективен (имеет меньшую временную сложность), чем алгоритм Беллмана - Форда, но веса рёбер (дуг) должны быть положительными. Учитывая, что во многих случаях выполняется положительность весов, приведём алгоритм Дейкстры согласно [17]. Считаем, что граф задан списками смежных вершин.
Пусть G=(V,X) – взвешенный орграф с n вершинами, для каждой дугиvi,vj которого введен неотрицательный вес (длина) µ(vi,vj ). Определим n× n
весовую матрицу М = (mij):
|
|
|
0, |
|
если |
i=j, |
|
mij |
|
∞, |
|
|
|
||
= |
|
если |
vi и vj не соединены дугой, |
||||
|
µ( v |
i |
,v |
j |
), если из vi идет дуга в vj . |
||
|
|
|
|
|
|
* ) Испанский поэт.

163
Поясним работу алгоритма Дейкстры, используя пример из [17]. Пусть имеем взвешенный орграф G=(V,X) диаграмма которого представлена на рис. 5.34. Матрица весов М = (mij) этого графа имеет следующий вид:
B |
1 |
C |
|
|
A |
B |
C |
D |
E |
F |
|
A |
0 2 ∞ 3 ∞ |
∞ |
|||||||
2 |
|
|
5 |
B |
∞ |
0 |
1 |
∞ |
4 |
∞ |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
М= C |
∞ ∞ 0 |
∞ ∞ |
5 . |
|||
A |
4 |
|
F |
|
|
|
|
|
|
|
|
D |
∞ |
∞ |
∞ |
0 |
2 |
∞ |
|||
|
|
|
|
|||||||
|
|
1 |
|
E |
∞ |
∞ |
∞ |
∞ |
0 |
1 |
|
|
|
|
|
|
|
|
|
|
|
3 |
|
|
|
F |
∞ ∞ ∞ ∞ ∞ |
0 |
||||
D |
2 |
E |
|
|
Допустим, что нужно найти |
|||||
|
|
|
|
кратчайший путь от вершины А к |
||||||
|
Рис. 5.34 |
|
|
любой другой |
вершине |
этого |
||||
|
|
|
|
орграфа. |
|
|
|
|
|
В процессе работы алгоритма каждой вершине v орграфа присваивается число d[v], равное расстоянию от вершины А до v. В начальный момент величины d[v] совпадают с весом (длиной) дуги А,v , если эта дуга существует, или равна ∞ в противном случае. В течение работы алгоритма обходятся вершины орграфа и уточняются значения d[v].
На каждом шаге алгоритма отмечается одна вершина u, до которой уже найден кратчайший путь от А и расстояние d[u] до неё. Далее полученное значение d[u] отмеченной вершины не меняется. Следовательно, на начальном шаге используется та строка матрицы весов М, которая построена для вершины А. Для оставшихся, не отмеченных вершин v, число d[v] будет меняться с учётом того, что искомый кратчайший путь до них от А будет проходить через последнюю отмеченную вершину u. Алгоритм завершается, когда все возможные вершины будут отмечены и получат свои окончательные значения d[v].
Работу алгоритма можно иллюстрировать с помощью следующей таблицы, каждая строка которой соответствует итерации (шагу) алгоритма.
Шаг |
Отмеченные |
|
Расстояние до вершины |
|
Неотмеченные |
|||
|
вершины |
А |
В |
C |
D |
E |
F |
вершины |
0 |
A |
0 |
2 |
∞ |
3 |
∞ |
∞ |
B, C, D, E, F |
1 |
B |
0 |
2 |
3 |
3 |
6 |
∞ |
C, D, E, F |
2 |
D |
0 |
2 |
3 |
3 |
5 |
∞ |
C, E, F |
3 |
C |
0 |
2 |
3 |
3 |
5 |
8 |
E, F |
4 |
E |
0 |
2 |
3 |
3 |
5 |
6 |
F |
5 |
F |
0 |
2 |
3 |
3 |
5 |
6 |
|
164
В каждой строке таблицы записываются отмеченная вершина, текущие значения d[v] и оставшиеся неотмеченные вершины. При этом жирным шрифтом выделяется наименьшее из значений d[v] среди неотмеченных вершин.
Используя выделенное (жирным шрифтом) значение d[v], выбирается следующая отмеченная вершина. Кроме того, в построенной таблице все значения d[v] для отмеченных вершин отделены от остальных ломаной линией.
Рассмотрим орграф, представленный на рис. 5.34. Для этого графа требуется найти кратчайшие пути от вершины А. Шаги алгоритма будут следующие.
Шаг 0. Отмечаем указанную вершину А и используем первую строку матрицы весов М для определения начальных значений d[v]. Начальные значений d[v] будут совпадать со значениями, d[v] записанными в первой строке матрицы весов М.
Шаг 1. Отмечаем вершину В, так как для неё d[В] имеет наименьшее значение в предыдущей строке таблицы (и выделена жирным шрифтом). Вычисляем длины путей, ведущих из А к неотмеченным вершинам через вершину В. Если новые значения d[v] оказываются меньше предыдущих, то меняем их на новые, иначе оставляем без изменения. Путь АВС имеет длину 3, а путь АВЕ – 6, в то время как старые расстояния до этих вершин от А были равны . Следовательно, заменим d[С] на 3 и d[Е] на 6.
Шаг 2. Наименьшее значение d[v] (среди неотмеченных) имеют две вершины: С и D. Отмечаем любую из них, например, вершину D. Вычисляем длины путей, ведущих из А к неотмеченным вершинам через вершины В и D. При этом значение d[Е] будет равно 5, остальные останутся без изменения.
Шаг 3. Наименьшее значение d[v] среди неотмеченных имеет вершина С. Отмечаем эту вершину С. Вычисляем длины путей, ведущих из А к неотмеченным вершинам через вершины В, D и С. При этом значение d[F] будет равно 8, остальные останутся без изменения.
Шаг 4. Отмечаем вершину Е, так как вершина Е имеет наименьшее значение d[v] (среди неотмеченных). Вычисляем длины путей, ведущих из А к неотмеченным вершинам через вершины В, D, С и Е. При этом значение d[F] будет равно 6, остальные останутся без изменения.
Шаг 5. Отмечаем вершину F.
В результате отмечены все вершины и найдены все кратчайшие пути из вершины А до каждой достижимой из А вершины.
Формальное представление алгоритма Дейкстры будет следующим. Отметим (еще раз), что этот алгоритм выбирает кратчайший путь от заданной вершины (для рассмотренного примера от вершины А) до любой вершины орграфа v и присваивает его длину переменной d[v], а в списке PUTH(v) перечисляются вершины кратчайшего пути от А до v.