Frod

03.10.2026

обход в ширину с++

Frod — свобода без границ

Обход в ширину с++: полное руководство для начинающих и профессионалов

Обход в ширину (BFS, Breadth-First Search) — одна из самых популярных и мощных алгоритмов в графах и деревьях. В этом материале я расскажу, как реализовать обход в ширину с++, какие задачи он решает, и на что стоит обратить внимание при использовании.

Что такое обход в ширину?

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

Почему именно с++?

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

Реализация обхода в ширину с++: пошагово

Шаг 1: Представление графа

Обычно граф в с++ реализуют с помощью списков смежности:

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

vector<vector<int>> graph; // список смежности
int n; // число вершин

Шаг 2: Инициализация данных

void initGraph(int vertices) {
 n = vertices;
 graph.resize(n);
}

Шаг 3: Добавление ребер

void addEdge(int u, int v) {
 graph[u].push_back(v);
 graph[v].push_back(u); // если граф неориентированный
}

Шаг 4: Реализация BFS

void bfs(int start) {
 vector<bool> visited(n, false);
 queue<int> q;

 visited[start] = true;
 q.push(start);

 while (!q.empty()) {
 int current = q.front();
 q.pop();
 cout << "Посещение вершины: " << current << endl;

 for (int neighbor : graph[current]) {
 if (!visited[neighbor]) {
 visited[neighbor] = true;
 q.push(neighbor);
 }
 }
 }
}

Шаг 5: Запуск алгоритма

int main() {
 initGraph(6);

 addEdge(0, 1);
 addEdge(0, 2);
 addEdge(1, 3);
 addEdge(2, 4);
 addEdge(3, 5);
 addEdge(4, 5);

 cout << "Обход в ширину, начиная с вершины 0:" << endl;
 bfs(0);

 return 0;
}

Важные моменты и советы

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

Итог

Обход в ширину с++ — это фундаментальный инструмент в арсенале любого разработчика, работающего с графами. Он прост в реализации, очень мощен и применяется во множестве задач — от анализа сетей до алгоритмов поиска путей.

Если вы хотите углубиться в тему, советую ознакомиться с алгоритмами поиска в графе, а также практиковаться на задачах с платформ типа Codeforces или LeetCode.