Implementando el recorrido BFS en un grafo

C++C++Beginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá a implementar el algoritmo de recorrido BFS (Breadth-First Search) para un grafo utilizando C++. El algoritmo BFS comienza con un nodo en un grafo y explora todos los nodos en el nivel de profundidad actual antes de pasar a los nodos del siguiente nivel. El recorrido BFS utiliza la estructura de datos llamada Cola. También explicaremos en detalle la estructura de datos Cola.

Configuración del proyecto

Navegue hasta el directorio project:

cd project

Cree un nuevo archivo C++ llamado main.cpp, usando:

touch main.cpp

Incluyendo las bibliotecas necesarias

En C++, usamos iostream para la entrada y salida, vector para almacenar elementos dinámicamente y queue para implementar el algoritmo de recorrido BFS (Breadth-First Search). También usamos el archivo de encabezado bits/stdc++.h para incluir todas las bibliotecas estándar. En el archivo main.cpp, escriba el siguiente código:

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

using namespace std;

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

Implementando el algoritmo de recorrido BFS (Breadth-First Search)

Crearemos una función llamada bfsTraversal, que toma un nodo de inicio como argumento. Esta función procesará el algoritmo de recorrido BFS.

void bfsTraversal(int b)
{
    queue<int> q; // Declare una cola para almacenar todos los nodos conectados a b
    q.push(b); // Inserta b en la cola
    v[b] = true; // Marca b como visitado

    cout << "\n\nEl recorrido BFS es:  ";

    while (!q.empty())
    {
        int a = q.front();
        q.pop(); // Elimina el primer elemento de la cola

        // Itera a través de todos los nodos que están conectados al nodo actual
        for (auto j = g[a].begin(); j!= g[a].end(); j++)
        {
            if (!v[*j])
            {
                v[*j] = true;
                q.push(*j); // Agrega el nodo conectado a la cola para su procesamiento
            }
        }
        cout << a << "  ";
    }
}

Agregando aristas al grafo

Crearemos una función llamada makeEdge que toma dos vértices y crea una arista entre ellos. Se llamará para cada arista del grafo.

void makeEdge(int a, int b)
{
    g[a].push_back(b); // Una arista desde el vértice a hasta el vértice b
}

Recibiendo la información del grafo

En este paso, recibiremos la información del grafo del usuario, incluyendo la cantidad de vértices y aristas, las vértices de origen y destino de las aristas, e inicializaremos los vectores.

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

    cout << "Ingrese la cantidad de vértices: ";
    cin >> n;

    cout << "Ingrese la cantidad de aristas: ";
    cin >> e;

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

    cout << "Ingrese las aristas con el vértice de origen y destino: ";

    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;
}

Compilando y ejecutando el programa

El siguiente paso es compilar y ejecutar el código. En la terminal, ejecute el siguiente comando:

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

Debería poder ver la salida del algoritmo de recorrido BFS (Breadth-First Search) del grafo en la terminal.

Código completo del archivo 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\nEl recorrido BFS es:  ";

    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 << "Ingrese la cantidad de vértices: ";
    cin >> n;

    cout << "Ingrese la cantidad de aristas: ";
    cin >> e;

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

    cout << "Ingrese las aristas con el vértice de origen y destino: ";

    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;
}

Resumen

En este laboratorio, aprendiste cómo implementar el algoritmo de recorrido BFS (Breadth-First Search) en un grafo utilizando C++. El algoritmo comienza con un nodo de inicio y explora todos los nodos del grafo. Utilizamos una estructura de datos de cola para implementar el algoritmo BFS. Al completar este laboratorio, has adquirido una mejor comprensión de los algoritmos de recorrido de grafos.