Графы. Обход графов в ширину и глубину.

Представление графов

Граф – это множество однотипных объектов (вершин), некоторые из которых связаны друг с другом какими-либо связями (ребрами). Одна связь всегда соединяет только две вершины (иногда – вершину саму с собой). Основные разновидности графов:

Примеры графов разных типов:

обычный

ориентированный

взвешенный

Для описания графа как структуры данных используются два способа: матрицы смежности и списки смежности. Первый способ предполагает использование двумерного массива чисел, который для простых графов заполняется только значениями 0 (нет связи) и 1 (есть связь), а для взвешенного – значениями весов. Для обычного графа матрица смежности всегда является симметричной относительно главной диагонали, а для орграфа чаще всего эта матрица не симметрична, что отражает одностороннюю направленность связей.
Для рассмотренных выше примеров матрицы смежности будут следующими:

 

A

B

C

D

E

A

0

1

1

1

1

B

1

0

0

0

1

C

1

0

0

1

0

D

1

0

1

0

0

E

1

1

0

0

0

 

A

B

C

D

E

A

0

1

1

0

0

B

1

0

0

0

1

C

0

1

0

1

1

D

1

0

0

0

1

E

0

0

0

0

0

 

A

B

C

D

E

A

0

15

0

9

0

B

15

0

10

0

0

C

0

10

0

22

6

D

9

0

22

0

19

E

0

0

6

19

0

 

Недостатки данного способа:

Этих недостатков во многом лишен второй способ, основанный на использовании списков смежных вершин. Здесь списки содержат ровно столько элементов, сколько ребер в графе, и кроме того вершины и ребра могут добавляться динамически. Список смежных вершин представляет собой главный список всех вершин и множество вспомогательных списков, содержащих перечень вершин, связанных с данной. Для рассмотренных выше обычного графа и ориентированного графа списки смежности будут следующими:

 
Описание подобной сложной списковой структуры выполняется обычным образом.
Операции добавления и удаления по сравнению с деревьями имеют следующие варианты:

Добавление нового ребра включает в себя (на примере обычного графа):

Добавление новой вершины включает в себя:

Удаление ребра производится следующим образом:

Удаление вершины производится следующим образом:

При обработке графов часто приходится выполнять обход всех его вершин. Правила обхода графов похожи на обход деревьев. Существуют два основных правила обхода, известные как поиск в глубину и поиск в ширину.

 

Обход в глубину


Поиск в глубину использует две структуры – стек для запоминания еще не обработанных вершин и список для запоминания уже обработанных. Поиск выполняется следующим образом:

Например, для рассмотренного выше обычного графа получим:

 

Поиск в ширину

Работает немного по другому: сначала обрабатываются все вершины, смежные с текущей, а лишь потом – их потомки. Вместо стека для запоминания еще не обработанных вершин используется очередь. Последовательность действий:

Тот же что и раньше пример даст следующий результат:

В заключение отметим несколько наиболее часто встречающихся задач на графах: