- •А.Н. Горитов
- •Учебное пособие
- •Учебное пособие
- •Введение
- •1 Введение в предмет
- •1.1 Непрерывная и дискретная информация
- •1.2 Данные и эвм
- •1.3 Объекты предметной области
- •1.4 Представление информации об объектах
- •1.5 Абстрактные алфавиты. Кодирование
- •2 Основные типы и структуры данных эвм
- •2.1 Архитектурные особенности эвм, наиболее существенные для представления данных
- •2.2 Основные понятия о типах и структурах данных
- •2.3 Массивы
- •2.4 Строки
- •2.5 Записи
- •2.6 Записи с вариантами
- •2.7 Множества
- •3 Последовательный файл
- •3.1 Основные свойства последовательных файлов
- •3.2 Сортировка последовательных файлов
- •4 Полустатические структуры
- •4.1 Стек, очередь и дек как полустатические структуры
- •4.2 Представление полустатических структур с помощью массивов
- •5 Линейные динамические структуры
- •5.1 Основные свойства динамических структур
- •5.2 Реализация связного списка массивом
- •5.3 Кольцевой связный список
- •5.4 Линейный двусвязный список
- •6 Представление динамических структур с помощью указателей
- •6.1 Указатели
- •6.2 Представление стека
- •6.3 Представление очереди
- •6.4 Ведение динамических списков с помощью указателей
- •6.5 Алгоритм составления кольцевого двусвязного списка
- •7 Древовидные структуры данных
- •7.1 Основные понятия и определения
- •7.2 Представление деревьев в эвм
- •7.3 Основные операции с бинарными деревьями
- •7.4 Сильно ветвящиеся деревья
- •8 Алгоритмы на графах
- •8.1 Машинное представление графов
- •8.2 Поиск в глубину в графе
- •8.3 Поиск в ширину в графе
- •8.4 Стягивающие деревья (каркасы)
- •8.5 Отыскание фундаментального множества циклов в графе
- •8.6 Эйлеровы пути в графе
- •8.7 Алгоритмы с возвратом
- •8.8 Нахождение кратчайших путей в графе
- •8.9 Кратчайшие пути от фиксированной вершины
- •8.10 Алгоритм Дейкстры
- •8.11 Пути в бесконтурном графе
- •Литература
8.11 Пути в бесконтурном графе
Рассмотрим второй случай, для которого известен алгоритм нахождения расстояний от фиксированной вершины за время 0(п2), а именно, случай, когда граф является бесконтурным.
Существует лемма, утверждающая, что в произвольном бесконтурном графе вершины можно перенумеровать так, что каждая дуга будет иметь вид (vt, V ■), где i < j.
Пример такой нумерации приведен на рис. 33.
7 (3) 8
Самый длинный путь в
S=l
бесконтурном графе
2 (2) 3
Рис. 33 Самый длинный путь в бесконтурном графе
Для доказательства рассмотрим алгоритм, реализующий такую перенумерацию.
В качестве исходных данных будем использовать граф (ориентированный, бесконтурный) G = <V, E>, заданный списками инцидентности СПИСОК[v] , v ∈V. Результатом работы алгоритма для каждой вершины v ∈V является номер N[v] такой, что для произвольной дуги (u, v)∈E выполняется неравенство N[u]<N[v].
1 BEGIN
FOR veV DO nz[v] := 0; {nz[v] - число дуг, входящих в v}
FOR ueV DO
4 FOR veСПИСОК[u] DO nz[v] := nz[v]+l;
СТЕК := 0;
FOR veV DO
7 IF nz[v] = 0 THEN СТЕК <= v;
num := 0;
WHILE СТЕК*0 DO BEGIN
u <t= СТЕК;
num := num + 1; N[u] := num;
FOR veСПИСОК[u] DO BEGIN
nz[v] := nz[v]-l;
IF nz[v] = 0 THEN СТЕК <= v
15 END
16 END
17 END
Алгоритм основывается на следующем факте: в произвольном бесконтурном графе существует вершина, в которую не заходит ни одна дуга.
Чтобы убедиться в этом, выберем произвольную вершину wi графа, затем некоторую вершину w2, такую, что w2 ->■ wb затем вершину w3, такую, что w3 ->■ w2, и т.д. Через конечное число шагов мы должны дойти до некоторой вершины wb в которую не заходит ни одна дуга, т.к. в силу бесконтурности графа ни одна вершина в последовательности Wi,w2,w3,... не может повторяться.
В нашем алгоритме вершины, в которые не заходит ни одна дуга, накапливаются в стеке. В строке 10 выбирается верхний элемент стека и (это мог бы быть произвольный элемент стека) и этой вершине присваивается самый маленький из еще неиспользованных номеров. Таким образом мы гарантируем, что все дуги, выходящие из этой вершины, ведут к вершинам с большими номерами. Затем вершина и вместе с выходящими из нее дугами удаляется из графа. Это приводит к уменьшению на 1 числа дуг, заходящих в каждую вершину v, такую, что и ->■ v. Это число запоминается в nz[v]. Если для какой-либо из вершин v это число сводится к нулю, то v помещается в стек.
В силу бесконтурности графа и всех предыдущих замечаний стек полностью опустошится и алгоритм закончит свою работу не раньше, чем все вершины получат свои номера.
Мы видим, что каждая дуга анализируется один раз в строке 4 и один раз в строке 12. Таким образом сложность алгоритма есть О(т).
Рассмотрим теперь алгоритм нахождения расстояний от источника до всех вершин в бесконтурном графе. При этом будем считать, что вершины графа уже перенумерованы, так что каждая дуга идет из вершины с меньшим номером в вершину с большим номером. Кроме того, будем считать, что граф задан списками инцидентности СПИСОКу], ve V.
Результатом работы алгоритма будут являться расстояния от vi до всех вершин графа, а именно D[Vi]=d(vbVi), i=l,...,n.
1 BEGIN
Dtvj] := 0;
FOR j := 2 TO n DO D[Vj] := oo;
FOR j := 2 TO n DO
5 FOR Vi£СПИСОК[Vj] DO D[Vj] := min(D[Vj], D[vJ + a[v;,
6 END
Можно доказать (это нетрудно) индукцией по j, что после выполнения цикла 4 для некоторого значения] выполняется равенство
D[vJ=d(vbVi), /=l,...,j.
Это вытекает из того факта, что все промежуточные вершины кратчайшего пути из vi в Vj имеют номера меньше j.
Сложность алгоритма есть О(т), т.к. каждая дуга (vt, V ) анализируется в строке 5 ровно один раз.
Последние два алгоритма находят применение, например, в методах управления выполнения некоторого проекта. Эти методы основаны на построении графа, дуги которого соответствуют некоторым задачам, составляющим проект, а их веса указывают на время, необходимое для решения отдельных задач. Кроме того, мы предполагаем, что для произвольных дуг (u, v) и (v, t) этого графа задача, изображаемая дугой (u, v) должна быть закончена перед началом решения задачи, изображаемой дугой (v, t). Легко заметить, что такой граф будет бесконтурным. Нашей целью является нахождение самого длинного пути из вершины s, соответствующей
началу проекта, до вершины t, соответствующей его окончанию (см. путь на рис. 33). Такой путь называется критическим путем. Его длина определяет время, необходимое для реализации всего проекта. Очевидно, эта задача сводится к задаче о кратчайшем пути простым изменением знака каждого веса a[u, v], где u → v , на обратный.
Контрольные вопросы
Машинное представление графов.
Поиск в глубину в графе.
Поиск в ширину в графе.
Стягивающие деревья.
Нахождение стягивающего дерева методом поиска в ширину.
Нахождение стягивающего дерева методом поиска в глубину.
Фундаментальное множество циклов в графе.
Нахождение множества фундаментальных циклов графа.
Эйлеровы пути и циклы. Необходимое и достаточное условие существования эйлерова пути.
Нахождение эйлерова цикла в графе.
Нахождение гамильтоновых циклов графа.
Нахождение кратчайших путей в графе.
Алгоритм Форда-Беллмана.
Алгоритм Дейкстры.