图论算法(二)广度优先搜索

这是一种连通图的常用遍历策略,通常用于求起点到各点的最短路径,以及求两点之间的最优路径等问题。首先我们先来看看广度优先搜索的具体方法吧:

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

1 选择图中任意一个顶点 v 作为起点进行访问,并将顶点 v 标为已访问。
2 遍历并访问与顶点 v 相邻且未被访问的所有顶点 c1c1, c2c2, …, ckck;接着遍历并访问与顶点 c1c1, c2c2, …, ckck 相邻且未被访问的顶点——也就是依次访问所有相邻顶点的相邻顶点;以此类推,直到所有顶点均被访问。

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

1 任意选择一个顶点 v 作为起点,加入队列;
2 访问队首元素 v 并标记,将其从队列中删除;
3 遍历与顶点 v 相邻且未被访问的所有顶点 c1c1, c2c2, …, ckck,并依次加入到队列中;
4 重复第二步和第三步操作,直到队列为空。

void bfs(int start_vertex) {
     queue<int> bfs_queue;
     bfs_queue.push(start_vertex);
     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);
             }
         }
     }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 11,077评论 0 19
  • 图是一种比线性表和树更复杂的数据结构,在图中,结点之间的关系是任意的,任意两个数据元素之间都可能相关。图是一种多对...
    Alent阅读 6,870评论 1 22
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 10,610评论 0 12
  • 数据结构与算法--图的搜索(深度优先和广度优先) 有时候我们需要系统地检查每一个顶点或者每一条边来获取图的各种性质...
    sunhaiyu阅读 7,449评论 0 5
  • 现实生活中有很大一类问题可以用简洁明了的图论语言来描述,可以转化为图论问题。 相关定义 图可以表示为G=(V, E...
    芥丶未央阅读 5,688评论 0 7