bfs广度优先搜索

原创 2016年06月01日 00:06:00

这一课我们来学习图的另一种遍历方法——广度优先搜索(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;
}
版权声明:ShirleyPaul原创,未经博主允许不得转载

BFS广度优先搜索——入门

BFS——广度优先搜索 广度优先搜索是通过对图的完全遍历来达到要求的点的算法。其对图的遍历是如同波浪一样,每层按照制定的方式一层一层向下搜。 如: 5 5 4 2 ...
  • ilblue
  • ilblue
  • 2016年10月26日 21:03
  • 2082

[C++]广度优先搜索(BFS)(附例题)

广度优先搜索(BFS)(附例题)问题产生:Isenbaev是国外的一个大牛。现在有许多人要参加ACM ICPC。一共有n个组,每组3个人。同组的3个人都是队友。大家都想知道自己与大牛的最小距离是多少。...
  • stary_yan
  • stary_yan
  • 2016年05月08日 14:16
  • 6941

广度优先搜索(BFS+STL queue)实现

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又...
  • q623702748
  • q623702748
  • 2016年05月21日 15:05
  • 1765

广度优先搜索BFS-C实现、思路、解析和总结

广度优先搜索BFS 基本简介 实现思路 实现效果 C代码实现广度优先搜索BFS基本简介对于每一个点,找到这个点能够直接连通的点,只做广度上的搜索而不做深度的搜索,在这个点的所有广度都搜索完成后,再扩展...
  • realDonaldTrump
  • realDonaldTrump
  • 2017年09月16日 16:29
  • 375

【算法】广度优先搜索(BFS)I

1. 算法描述 2. Referrence 3. 问题 3.1 POJ 3278 追及问题,在n处的FJ可以左移、右移,也可以成两倍地移,求最快需要多少步追上在k处的cow。 可以...
  • lifehack
  • lifehack
  • 2013年12月01日 20:44
  • 4995

BFS-广度优先搜索算法(图)

广度优先搜索算法(Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点...
  • furturerock
  • furturerock
  • 2010年05月07日 20:54
  • 58596

广度优先搜索算法(BFS)

使用计算机求解的问题中,有许多问题是无法用数学公式进行计算推导采用模拟方法来找出答案的。这样的问题往往需要我们根据问题所给定的一些条件,在问题的所有可能解中用某种方式找出问题的解来,这就是所谓的搜索法...
  • kofandlizi
  • kofandlizi
  • 2011年05月15日 12:44
  • 13405

广度优先搜索(BFS) C语言实现

伪代码
  • andyyang0212
  • andyyang0212
  • 2014年10月18日 17:58
  • 2865

BFS 广度优先搜索 解析

1.概念:        广度优先搜索算法(Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽...
  • wr132
  • wr132
  • 2015年01月29日 18:09
  • 1544

八皇后问题 BFS求出所有解

以前就听说过八皇后问题,没学BFS的时候,完全没有头绪,学了BFS后,也没想起这道题,前几天偶偶又看到了这道题,于是心血来潮,决定用BFS遍历找出所有解(方法很拙,勿喷),采用的数据结构感觉也不是很好...
  • u010078776
  • u010078776
  • 2014年03月05日 17:15
  • 1903
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bfs广度优先搜索
举报原因:
原因补充:

(最多只允许输入30个字)