📜  图使用队列 c++ (1)

📅  最后修改于: 2023-12-03 15:37:16.411000             🧑  作者: Mango

图使用队列 - C++

介绍

在图论算法中,队列(Queue)是一种常用的数据结构。我们可以使用队列来构建广度优先搜索(BFS)算法,该算法用于寻找两个节点之间的最短路径。在广度优先搜索中,我们需要遍历所有可能的路径,从而找到最短路径。

本文将介绍如何使用队列来实现广度优先搜索算法,并提供C++代码示例。

安装与配置

在C++中使用队列之前,我们需要确保已经正确安装并配置了C++编译器。我们建议使用gcc编译器,该编译器可用于各种操作系统。

对于Linux/Mac OS X用户,可以通过Terminal窗口安装gcc编译器,在终端窗口中输入以下指令:

sudo apt-get install g++

对于Windows用户,可以在Microsoft Visual Studio中使用C++编译器。

实现

接下来,让我们使用队列来实现广度优先搜索算法。我们将使用邻接表来表示图,其中每个节点都是一个列表,该列表存储与该节点相邻的所有节点。节点可以用数字或字母来表示。

在我们的广度优先搜索算法中,我们需要首先定义一个队列(Queue),该队列用于存储要访问的节点。我们还需要定义一个访问过的节点集合(Visited Set),该集合用于存储已经访问过的节点,以避免重复访问。

以下是基于队列的广度优先搜索算法的示例代码:

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

vector<vector<int>> adj; // 邻接表
vector<bool> visited; // 访问过的节点

void bfs(int start) {
    queue<int> q; // 存储要访问的节点
    visited[start] = true; // 标记起始节点已访问
    q.push(start); // 将起始节点加入队列

    while (!q.empty()) {
        int current = q.front(); // 取出队列的第一个元素
        q.pop();

        // 访问当前节点周围的所有节点
        for (int i = 0; i < adj[current].size(); i++) {
            int neighbor = adj[current][i];
            if (!visited[neighbor]) {
                visited[neighbor] = true; // 标记该节点已访问
                q.push(neighbor); // 将该节点加入队列
            }
        }
    }
}

int main() {
    int n, m; // n表示节点数,m表示边数
    cin >> n >> m;
    adj.resize(n + 1);
    visited.resize(n + 1);

    // 构建邻接表
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    // 从第一个节点开始进行广度优先搜索
    int start = 1;
    bfs(start);

    // 输出访问过的所有节点
    for (int i = 1; i <= n; i++) {
        if (visited[i]) {
            cout << "Node " << i << " has been visited." << endl;
        }
    }

    return 0;
}
总结

队列是一种有用的数据结构,可用于实现图算法中的广度优先搜索。在C++中,我们可以使用std::queue来定义队列。通过使用队列和邻接表,我们可以轻松地构建广度优先搜索算法。

总之,队列是C++编程中不可或缺的一部分,值得我们深入学习!