5.4. Алгоритм нахождения компонент связности в графе

Автор: Мария Горденко

В этой статье вы научитесь находить компоненты связности в неориентированном графе — группы вершин, внутри которых существует путь между любыми двумя. Эта задача возникает, например, при анализе социальных сетей, компьютерных сетей или при кластеризации данных. Мы разберём, как с помощью обхода в глубину (DFS) и в ширину (BFS) выделять такие компоненты и как эффективно реализовать алгоритм даже для больших графов.

Ключевые вопросы статьи

  • Что именно называют компонентой связности в неориентированном графе?
  • Как применить DFS и BFS, чтобы выделить все компоненты?
  • Зачем обход нужно запускать от каждой непосещённой вершины?

Применение алгоритмов поиска в глубину и ширину

Алгоритмы поиска в глубину и ширину находят широкое применение и могут использоваться в других алгоритмах. Рассмотрим один из таких алгоритмов для поиска компонент связности в графе. Под компонентой связности в графе понимают множество вершин графа достижимых попарно и рёбра их связывающие. Для поиска компонент связности необходимо из каждой не посещённой вершины запускать алгоритм обхода, накапливая результаты каждого в отдельный контейнер. Пример ниже поможет понять алгоритм.

algorithms_5.4_1.gif

Асимптотическая сложность нахождения компонент связности в графе — O(V+E), где V — число вершин, а E — число рёбер и дуг.

Упражнение

Попробуйте реализовать данный алгоритм.

Что дальше

Теперь вы умеете находить компоненты связности в графе и применять для этого DFS или BFS. Вы поняли, почему одного обхода недостаточно и как обойти весь граф по частям.

Далее — более сложные задачи, в которых нужно находить кратчайшие пути между вершинами. Вы узнаете, как работает алгоритм Дейкстры и в каких ситуациях его можно применять.

Ключевые выводы статьи

  • Компоненты связности — это группы вершин неориентированного графа, внутри которых существует путь между любыми двумя вершинами.
  • Чтобы найти все компоненты, используют обход графа: в глубину (Depth-First Search, DFS) или в ширину (Breadth-First Search, BFS), начиная каждый раз с новой не посещённой вершины.
  • Важно правильно отмечать посещённые вершины и учитывать номер компоненты, к которой они принадлежат.
  • Выделение компонент связности помогает понять структуру графа и служит основой для последующего анализа и алгоритмов кластеризации.