图的广度优先遍历算法

简介:

前言

广度优先遍历算法是图的另一种基本遍历算法,其基本思想是尽最大程度辐射能够覆盖的节点,并对其进行访问。以迷宫为例,深度优先搜索更像是一个人在走迷宫,遇到没有走过就标记,遇到走过就退一步重新走;而广度优先搜索则可以想象成一组人一起朝不同的方向走迷宫,当出现新的未走过的路的时候,可以理解成一个人有分身术,继续从不同的方向走,,当相遇的时候则是合二为一(好吧,有点扯了)。

广度优先遍历算法的遍历过程

图

仍然以上一篇图的深度优先遍历算法的例子进行说明,下面是广度优先遍历的具体过程:

  1. 从起点0开始遍历
  2. 从其邻接表得到所有的邻接节点,把这三个节点都进行标记,表示已经访问过了
  3. 从0的邻接表的第一个顶点2开始寻找新的叉路
  4. 查询顶点2的邻接表,并将其所有的邻接节点都标记为已访问
  5. 继续从顶点0的邻接表的第二个节点,也就是顶点1,遍历从顶点1开始
  6. 查询顶点1的邻接表的所有邻接节点,也就是顶点0和顶点2,发现这两个顶点都被访问过了,顶点1返回
  7. 从顶点0的下一个邻接节点,也就是顶点5,开始遍历
  8. 查询顶点5的邻接节点,发现其邻接节点3和0都被访问过了,顶点5返回
  9. 继续从2的下一个邻接节点3开始遍历
  10. 寻找顶点3的邻接节点,发现都被访问过了,顶点3返回
  11. 继续寻找顶点2的下一个邻接节点4,发现4的所有邻接节点都被访问过了,顶点4返回
  12. 顶点2的所有邻接节点都放过了,顶点2返回,遍历结束

广度优先遍历算法的实现

与深度优先遍历算法相同,都需要一个标记数组来记录一个节点是否被访问过,在深度优先遍历算法中,使用的是一个栈来实现的,但是广度优先因为需要记录与起点距离最短的节点,或者说能够用尽可能少的边连通的节点,距离短的优先遍历,距离远的后面再遍历,更像是队列。所以在广度优先遍历算法中,需要使用队列来实现这个过程。下面是具体的实现代码(已附详细注释):

package com.rhwayfun.algorithm.graph;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 广度优先搜索
 * <p>Title:BreadFirstSearch</p>
 * <p>Description:</p>
 * @author rhwayfun
 * @date Dec 23, 2015 4:43:41 PM
 * @version 1.0
 */
public class BreadFirstSearch {

    //创建一个标记数组
    private boolean[] marked;
    //起点
    private int s;

    public BreadFirstSearch(MyGraph G, int s){
        marked = new boolean[G.V()];
        this.s = s;
        //开始广度优先搜索
        bfs(G,s);
    }

    private void bfs(MyGraph G, int s2) {
        //创建一个队列
        Queue<Integer> queue = new LinkedList<Integer>();
        //标记起点
        marked[s] = true;
        queue.add(s);
        System.out.print(s + " ");
        while(!queue.isEmpty()){
            //从队列中删除下一个节点
            int v = queue.poll();
            //将该节点的所有邻接节点加入队列中
            for(int w : G.adj(v)){
                //如果没有标记就标记
                if(!marked[w]){
                    marked[w] = true;
                    System.out.print(w + " ");
                    queue.add(w);
                }
            }
        }
    }
}
AI 代码解读

运行该程序,发现广度优先遍历算法对上图的遍历顺序是0,2,1,5,3,4。

目录
打赏
0
0
0
0
85
分享
相关文章
图计算中的社区发现算法是什么?请解释其作用和常用算法。
图计算中的社区发现算法是什么?请解释其作用和常用算法。
202 0
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
这篇文章详细介绍了图的概念、表示方式以及深度优先遍历和广度优先遍历的算法实现。
93 1
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
544 0
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
65 4
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
75 1
|
8月前
|
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
107 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
「AIGC算法」图搜索算法详解
本文探讨了图搜索算法,包括遍历和最短路径搜索。DFS和BFS是遍历算法,前者使用栈深入搜索,后者用队列逐层遍历。Dijkstra、Bellman-Ford、A*、Floyd-Warshall和Johnson算法则解决最短路径问题。文中还给出了DFS的Python实现示例。这些算法在路径规划、网络分析等领域有重要应用。
324 0
c++算法学习笔记 (8) 树与图部分
c++算法学习笔记 (8) 树与图部分
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
100 13

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等