9.5 Упражнения¶
9.5.1 Вопросы для самопроверки¶
1. Два представления одного графа¶
Неориентированный граф содержит 4 вершины A, B, C, D и ребра
A-B, A-C, B-C, C-D.
- Запишите его список смежности.
- Заполните матрицу смежности, содержащую только 0 и 1.
- Какое представление графа позволяет определить, соединены ли напрямую
AиD, просмотрев лишь один элемент хранилища? - Какое представление обычно экономнее по памяти, если в графе много вершин, но мало ребер?
Ответ
-
Список смежности:
-
Матрица смежности:
A B C D A 0 1 1 0 B 1 0 1 0 C 1 1 0 1 D 0 0 1 0 -
В матрице смежности достаточно посмотреть ячейку на пересечении строки
Aи столбцаD, поэтому она удобна для проверки прямой связи любой пары вершин. -
Если вершин много, а ребер мало, список смежности хранит только существующие ребра и обычно занимает меньше памяти, чем матрица, в которой место отводится каждой паре вершин.
2. Порядок обхода в ширину и в глубину¶
Неориентированный граф содержит вершины A, B, C, D, E и ребра
A-B, A-C, B-D, C-D, D-E.
Начните с A и при наличии нескольких непосещенных смежных вершин выбирайте их в алфавитном порядке.
- Запишите порядок обхода в ширину (BFS).
- Запишите порядок рекурсивного обхода в глубину (DFS).
- Почему при обоих обходах необходимо отмечать уже посещенные вершины?
Ответ
-
Порядок BFS:
A, B, C, D, E. Сначала посещаются B и C, отстоящие от A на одно ребро, а затем более далекие D и E. -
Порядок DFS:
A, B, D, C, E. Обход последовательно переходит в непосещенную смежную вершину текущей вершины, поэтому сначала проходит путьA → B → D → C. Когда у C не остается новых смежных вершин, обход возвращается к D и посещает E. -
В графе есть цикл, например
A-B-D-C-A. Если не отмечать посещенные вершины, обход может снова и снова проходить по циклу через одни и те же вершины и не завершиться.
3. Можно ли посетить весь граф за один BFS¶
Неориентированный граф содержит вершины A, B, C, D, E, F и только ребра
A-B, B-C, D-E.
- Какие вершины можно посетить за один BFS, начав с A?
- Посещены ли после этого все вершины графа? Почему?
- Если перебирать все вершины в алфавитном порядке и запускать новый BFS при каждой непосещенной вершине, какие вершины станут начальными для отдельных запусков? На сколько несвязанных частей (компонент связности) разделен граф?
Ответ
-
Из A можно посетить только
A, B, C. -
Не все вершины посещены.
D, Eобразуют другую связную часть, а F — отдельная вершина; путей от A до них нет, поэтому из A они недостижимы. -
Начальными вершинами трех запусков BFS будут последовательно
A, D, F; они посетят{A, B, C},{D, E}и{F}соответственно. Следовательно, граф содержит 3 компоненты связности.
9.5.2 Задачи по программированию¶
1. Проверка существования пути в неориентированном графе¶
Дан неориентированный граф из \(n\) вершин, пронумерованных от \(0\) до \(n-1\). Каждый элемент [u, v] массива edges обозначает неориентированное ребро между вершинами u и v.
Также даны начальная вершина source и конечная вершина destination. Сначала постройте по edges список смежности, а затем с помощью BFS или DFS
определите, существует ли путь от source до destination: если существует, верните true, иначе — false.
Граф может содержать циклы и быть несвязным.
Подсказки
- Каждое неориентированное ребро нужно добавить в обоих направлениях
- Граф может содержать циклы, поэтому обязательно отмечайте уже посещенные вершины
- Начните с source: встретив destination, верните true; если обход завершился без нее, верните false