Реализация обхода в ширину (BFS) на графе

C++Beginner
Практиковаться сейчас

Введение

В этом лабе вы научитесь реализовывать алгоритм обхода в ширину (BFS) для графа на C++. Алгоритм BFS начинается с узла в графе и исследует все узлы на текущем уровне глубины, прежде чем переходить к узлам на следующем уровне. Обход в ширину использует структуру данных, называемую Очередью. Мы также детально объясним структуру данных Очередь.

Настройка проекта

Перейдите в директорию project:

cd project

Создайте новый файл на C++, названный main.cpp, используя:

touch main.cpp

Подключение необходимых библиотек

В C++ мы используем iostream для ввода и вывода, vector для динамического хранения элементов и queue для реализации алгоритма обхода в ширину (BFS). Мы также используем заголовочный файл bits/stdc++.h, чтобы включить все стандартные библиотеки. В файле main.cpp введите следующий код:

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

vector<bool> v;
vector<vector<int>> g;

Реализация алгоритма обхода в ширину (BFS)

Мы создадим функцию под названием bfsTraversal, которая будет принимать начальный узел в качестве аргумента. Эта функция будет обрабатывать алгоритм обхода в ширину.

void bfsTraversal(int b)
{
    queue<int> q; // Объявим очередь для хранения всех узлов, соединенных с b
    q.push(b); // Вставим b в очередь
    v[b] = true; // Отметим b как посещенный

    cout << "\n\nОбход в ширину:  ";

    while (!q.empty())
    {
        int a = q.front();
        q.pop(); // Удалим первый элемент из очереди

        // Переберем все узлы, соединенные с текущим узлом
        for (auto j = g[a].begin(); j!= g[a].end(); j++)
        {
            if (!v[*j])
            {
                v[*j] = true;
                q.push(*j); // Добавим соединенный узел в очередь для обработки
            }
        }
        cout << a << "  ";
    }
}

Добавление ребер в граф

Мы создадим функцию под названием makeEdge, которая будет принимать два вершины и создавать ребро между ними. Эта функция будет вызываться для каждого ребра графа.

void makeEdge(int a, int b)
{
    g[a].push_back(b); // Ребро от вершины a к вершине b
}

Прием информации о графе

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

int main()
{
    int n, e, a, b, i;

    cout << "Введите количество вершин: ";
    cin >> n;

    cout << "Введите количество ребер: ";
    cin >> e;

    v.assign(n, false);
    g.assign(n, vector<int>());

    cout << "Введите ребра с исходной и целевой вершиной: ";

    for (i = 0; i < e; i++)
    {
        cin >> a >> b;
        makeEdge(a, b);
    }

    for (i = 0; i < n; i++)
    {
        if (!v[i])
        {
            bfsTraversal(i);
        }
    }

    return 0;
}

Компиляция и запуск программы

Следующим шагом является компиляция и запуск кода. В терминале выполните следующую команду:

g++ main.cpp -o main &&./main

На терминале вы должны увидеть вывод алгоритма обхода в ширину (BFS) графа.

Полный код файла main.cpp

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

vector<bool> v;
vector<vector<int>> g;

void bfsTraversal(int b)
{
    queue<int> q;
    q.push(b);
    v[b] = true;

    cout << "\n\nОбход в ширину:  ";

    while (!q.empty())
    {
        int a = q.front();
        q.pop();

        for (auto j = g[a].begin(); j!= g[a].end(); j++)
        {
            if (!v[*j])
            {
                v[*j] = true;
                q.push(*j);
            }
        }
        cout << a << "  ";
    }
}

void makeEdge(int a, int b)
{
    g[a].push_back(b);
}

int main()
{
    int n, e, a, b, i;

    cout << "Введите количество вершин: ";
    cin >> n;

    cout << "Введите количество ребер: ";
    cin >> e;

    v.assign(n, false);
    g.assign(n, vector<int>());

    cout << "Введите ребра с исходной и целевой вершиной: ";

    for (i = 0; i < e; i++)
    {
        cin >> a >> b;
        makeEdge(a, b);
    }

    for (i = 0; i < n; i++)
    {
        if (!v[i])
        {
            bfsTraversal(i);
        }
    }

    return 0;
}

Резюме

В этом лабе вы узнали, как реализовать алгоритм обхода в ширину (BFS) на графе с использованием C++. Алгоритм начинается с начального узла и исследует все узлы графа. Мы использовали структуру данных очередь для реализации алгоритма BFS. Завершив этот лаб, вы приобрели более глубокое понимание алгоритмов обхода графов.