宽度优先搜索(BFS)

本文介绍了宽度优先搜索(BFS)算法在C++中的实现,通过邻接列表和队列数据结构,展示了如何从指定顶点开始遍历图,以及如何跟踪已访问的顶点。
摘要由CSDN通过智能技术生成

宽度优先搜索(Breadth-First Search, BFS)是一种用于遍历或搜索树或图的算法。与深度优先搜索不同,宽度优先搜索会先访问离根节点近的节点。BFS通常使用队列(queue)来实现,因为它遵循先进先出(FIFO)的原则。

以下是使用C++实现宽度优先搜索的一个例子,用于遍历图的所有顶点:

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

using namespace std;

// 图的类表示
class Graph {
    int V; // 顶点的数量
    vector<int> *adj; // 邻接列表

public:
    Graph(int V); // 构造函数
    void addEdge(int v, int w); // 添加边
    void BFS(int s); // 从顶点s开始的宽度优先搜索
};

Graph::Graph(int V) {
    this->V = V;
    adj = new vector<int>[V];
}

void Graph::addEdge(int v, int w) {
    adj[v].push_back(w); // 添加w到v的列表
}

void Graph::BFS(int s) {
    bool *visited = new bool[V]; // 标记所有顶点为未访问
    for (int i = 0; i < V; i++)
        visited[i] = false;

    queue<int> q; // 创建一个队列用于BFS
    q.push(s); // 将起始顶点推入队列
    visited[s] = true; // 标记起始顶点为已访问

    while (!q.empty()) {
        s = q.front(); // 取出队列的第一个顶点
        cout << s << " "; // 访问该顶点
        q.pop(); // 弹出队列的第一个顶点

        // 将所有未访问的相邻顶点推入队列
        for (auto i = adj[s].begin(); i != adj[s].end(); ++i) {
            if (!visited[*i]) {
                q.push(*i);
                visited[*i] = true;
            }
        }
    }
}

// 测试代码
int main() {
    Graph g(4); // 创建一个有4个顶点的图
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(2, 0);
    g.addEdge(2, 3);
    g.addEdge(3, 3);

    cout << "Breadth First Traversal (starting from vertex 2): ";
    g.BFS(2); // 从顶点2开始进行BFS遍历

    return 0;
}

注意:在这个例子中,Graph 类使用了一个动态数组 adj 来存储邻接列表。BFS 方法中创建了一个布尔类型的数组 visited 来跟踪访问过的顶点,并使用了一个 queue 来按照宽度优先的顺序访问顶点。在 main 函数中,我们创建了一个图,并添加了一些边,然后从顶点2开始进行宽度优先遍历。

此外,请注意,在真实场景中,你可能需要考虑更多的边界条件和错误处理,例如检查传递给 BFS 方法的顶点是否在图的范围内。这个例子假设了所有操作都是有效的,并且没有错误处理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值