Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2260.doc
Скачиваний:
71
Добавлен:
24.09.2019
Размер:
3.71 Mб
Скачать

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]