- •В. Н. Степанов дискретная математика: графы и алгоритмы на графах
- •Предисловие
- •1. Основные понятия теории графов
- •1.1. Граф и его разновидности
- •1.2. Морфизмы графов
- •1.3. Степени вершин
- •1.4. Маршруты, цепи, циклы, связность
- •1.5. Операции над графами
- •1.6. Примеры графов
- •1.7. Метрические характеристики графов
- •1.8. Представления графов
- •2. Алгоритмы и сложность
- •2.1. Понятие алгоритма
- •2.2. Сложность алгоритма
- •2.3. Запись алгоритма
- •3. Обходы графов
- •3.1. Поиск в глубину на графе
- •3.2. Поиск в ширину на графе
- •3.3. Алгоритм выделения компонент связности
- •4. Деревья
- •4.1. Деревья. Свойства деревьев
- •4.2. Остовы. Теорема Кирхгофа
- •4.3. Теорема Кэли
- •4.4. Фундаментальная система циклов. Цикломатическое число
- •4.5. Алгоритм отыскания фундаментального множества циклов на графе
- •5. Остов минимального веса. Алгоритм Краскала и Прима
- •5.1. Алгоритм д. Краскала
- •5.2. Алгоритм р. Прима
- •6. Кратчайшие пути между вершинами графа
- •6.1. Алгоритм Дейкстры
- •6.2. Алгоритм Флойда
- •7. Эйлеровы графы
- •7.1. Теорема Эйлера
- •7.2. Алгоритм Флёри
- •8. Гамильтоновы графы
- •8.1. Гамильтоновы маршруты. Задача коммивояжера
- •8.2. Существование гамильтоновых маршрутов
- •9. Алгоритмы отыскания гамильтоновых циклов
- •9.1. Алгоритм с возвратом (полного перебора)
3.2. Поиск в ширину на графе
Рассмотрим теперь процедуру обхода графа в ширину. При поиске в ширину, достигнув некоторой вершины (в начале поиска ), помечаем ее. Затем просматриваем все вершины из ее списка смежности и помечаем все ранее не помеченные вершины списка. После того, как помечены все вершины из списка смежности , вершину считаем обработанной и продолжаем обработку других вершин списка по очереди. Обход графа в ширину заканчивается, когда все вершины полностью обработаны или продолжение поиска невозможно.
Принципиальное отличие поиска в ширину от поиска в глубину заключается в том, что при поиске в ширину обрабатывается сразу весь список смежности текущей вершины.
Алгоритм 3.2.1 (поиск в ширину).
Вход: граф , представленный списками смежности вершин.
Выход: последовательность обхода вершин.
1. procedure ;
2. begin
3. ;
4. while do
5. begin
6.
7. for do
8. if then
9. begin
10. father
11.
12. end
13. end
14. end
15. begin
16.
17. for do
18. for do
19. if then
20. begin father end
21. end.
1BFS – breadth depth first search
В алгоритме поиска в ширину рассматривается очередь Q, элементами которой являются вершины графа G. Поиск начинается с некоторой вершины . Эта вершина помещается в очередь Q и с этого момента считается просмотренной. Вершины, смежные с , включаются в очередь и получают статус просмотренных, а вершина из очереди удаляется.
Поиск в ширину просматривает вершины в определенном порядке. Как и раньше, этот порядок фиксируется в массиве num. Если u отец вершин , то . Для начальной вершины полагают .
Пример 3.2.1. Результаты поиска в ширину на графе и орграфе представлены на рисунках 3.2.1 (a, б).
Для всякого связного графа поиск в глубину и ширину единственным образом обходит все вершины графа. Сложность поиска в глубину составляет и в среднем вдвое быстрее, чем поиск в ширину. Общий алгоритм поиска в глубину и ширину приведен в [19].
3.3. Алгоритм выделения компонент связности
Рассмотрим алгоритм нахождения числа компонент связности, а также выделения этих компонент на простом графе. В основе алгоритма выделения компонент связности лежит техника поиска в глубину на графе . Работа алгоритма направлена на формирование вектора меток вершин графа. Элементу присваивается общий номер той компоненты,
которой принадлежит вершина . Сложность алгоритма составляет .
Алгоритм 3.3.1 (выделения компонент связности простого графа).
Вход: граф , представленный списками смежности вершин.
Выход: список компонент связности.
1. begin
2. for do ; *инициализация*
3. ; *счетчик числа компонент*
4. for do if then;
5. begin
6.
7. Component ( , count);
8. end;
9. Procedure Component ( , count);
10. count;
11. for do if then
12. Component ( , count);
13. end;
14. end.
Пример 3.3.1. Для графа, изображенного на рис. 3.3.1, алгоритм, применяя обход графа в глубину, находит три компоненты связности, присваивая вершинам 1, 2, 3, 4 метку 1; вершинам 5, 6, 7, 8 метку 2 и метку 3 для вершин 9, 10, 11.
|