关闭

bfs广度优先搜索

标签: bfs搜索
118人阅读 评论(0) 收藏 举报
分类:

这一课我们来学习图的另一种遍历方法——广度优先搜索(Breadth-First-Search,简称 BFS)。这是一种连通图的常用遍历策略,通常用于求起点到各点的最短路径,以及求两点之间的最优路径等问题。首先我们先来看看广度优先搜索的具体方法吧:

对于一个连通图,我们假设一开始所有顶点均未被访问,广度优先搜索的主要操作如下:

1 选择图中任意一个顶点 v 作为起点进行访问,并将顶点 v 标为已访问。

2 遍历并访问与顶点 v 相邻且未被访问的所有顶点 c1,c​2​​ , …, c​k


;接着遍历并访问与顶点 c1,c​2​​ , …, c​k
​​ 相邻且未被访问的顶点——也就是依次访问所有相邻顶点的相邻顶点;以此类推,直到所有顶点均被访问。

对于算法的具体实现,结合队列先进先出的特性,我们可以借助队列这一数据结构来实现广度优先搜索:

1 任意选择一个顶点 v 作为起点,加入队列;

2 访问队首元素 v 并标记,将其从队列中删除;

3 遍历与顶点 v 相邻且未被访问的所有顶点  c1,c​2​​ , …, c​k


​​ ,并依次加入到队列中;

4 重复第二步和第三步操作,直到队列为空。
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

class Graph {
private:
    int n;
    bool *visited;
    vector<int> *edges;

public:
    Graph(int input_n) {
        n = input_n;
        edges = new vector<int>[n];
        visited = new bool[n];
        memset(visited, 0, n);
    }

    ~Graph() {
        delete[] edges;
        delete[] visited;
    }

    void insert(int x, int y) {
        edges[x].push_back(y);
        edges[y].push_back(x);
    }

    void bfs(int start_vertex) {
        queue<int> bfs_queue;
        bfs_queue.push(start_vertex);
        visited[start_vertex]=true;
        while(!bfs_queue.empty()){
            int vertex=bfs_queue.front();
            cout<<vertex<<endl;
            bfs_queue.pop();
            for(int adj_vertex:edges[vertex]){
                if(!visited[adj_vertex]){
                    visited[adj_vertex]=true;
                    bfs_queue.push(adj_vertex);   
                }
            }
        }
    }
};

int main() {
    int n, m, k;
    cin >> n >> m;
    Graph g(n);
    for (int i = 0; i < m; ++i) {
        int x, y;
        cin >> x >> y;
        g.insert(x, y);
    }
    cin >> k;
    g.bfs(k);
    return 0;
}
0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14896次
    • 积分:729
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:7篇
    • 译文:0篇
    • 评论:0条
    文章分类