彻底搞懂图的广度优先算法

 广度优先算法

算法的思想,算法步骤,代码实现与分析,最后"debug+图解"展示展开

会有一定的图示,以便于更好的理解(博主的自我思考,如有错误,欢迎指正)

需要源码与相关图解请评论区留言

DOC注释在深度优先算法中,若不看,则当前代码无法熟知

博主空间https://blog.csdn.net/JOElib?spm=1010.2135.3001.5343深度优先算法(含Javadoc)https://blog.csdn.net/JOElib/article/details/123978630?spm=1001.2014.3001.5501winRAR系列https://blog.csdn.net/JOElib/article/details/123965081?spm=1001.2014.3001.5501


目录

算法思想🐼

算法步骤🐼 

代码实现与分析🐼 

1.创建BFS(广度优先)核心算法方法🐻

代码分析:🐨

2.创建BFS方法的重载方法🐻

Debug与图解🐼

结论: 


算法思想🐼

  • 广度优先搜索类似于一个分层搜索的过程,广度优先搜索需要调用一个队列以保持访问过节点的顺序,以便这个顺序来访问这些节点和邻接节点

算法步骤🐼 

  1.  访问初始节点v,并标记该节点为已访问
  2.  将节点v放入队列
  3. 当队列为非空时,继续执行,否则算法结束
  4. 出队列,取得队列头结点为u
  5. 查找节点u的第一个邻接节点w
  6. 若u的邻接节点不存在,则继续执行步骤3,否则循环执行下面三个操作
    1. 节点若未被访问,访问该节点并标记为已读
    2. 节点w加入队列
    3. 查找节点u的后继节点后的下一个邻接节点,转到步骤6

代码实现与分析🐼 

1.创建BFS(广度优先)核心算法方法🐻

严格遵守算法步骤 

private void bfs(boolean[] isVisited, int v) {
        var queue = new LinkedList<Integer>();
        System.out.println(getItem(v));
        isVisited[v] = true;
        queue.addLast(v);
        while (!queue.isEmpty()) {
            var u = queue.removeFirst();
            var w = getFirstVertex(u);
            while (w != -1) {
                if (!isVisited[w]) {
                    System.out.println(getItem(w));
                    isVisited[w] = true;
                }
                w = getVertexByLast(u,w);
            }
        }
    }

代码分析:🐨

  1. 创建一个双向链表集合,从而模拟队列,并指定泛型为Integer
  2. 访问当前节点,并将当前节点标记为已读
  3. 将当前节点加入到队列中
    1. 注意:这里一定要调用addLast()方法,因为要模拟队列,必须遵守先进先出后进后出的原则,如排队一般,最新进来的人排到最后
  4. 当队列不为空的时候循环执行以下代码(即:调用集合的isEmpty()方法)
    1. 取出队列的头节点,为u
      1. 注意:一定要调用removeFirst()方法,该方法返回被删除的元素,因为队列的先进先出,所以,我们要取最开始进入的元素
    2. 调用getFirstVertex()方法,找到他的第一个邻接节点
    3. 若该邻接节点存在
      1. 先判断该邻接节点是否被访问,即!isVisited[w],如果没有被访问,则进入访问该节点并标记为已读,并将该节点加入队列
      2. 无论是否被访问,都要找到该下一个邻接节点,否则无法体现出BFS
        1. 注意:这里一定要记住赋值操作

2.创建BFS方法的重载方法🐻

@First("The BFS should be firstly invoked")
public void bfs() {
        for (int i = 0; i < vertexList.size(); i++) {
            if (!isVisited[i]) {
                bfs(isVisited,i);
            }
        }
}

Debug与图解🐼

以该"图"展开分析

对应的邻接矩阵(ABCDE对应的下标分别是01234)

 

 

 

 

 

 重复上述的操作,直到

 


结论: 

        广度优先算法就这样结束了,相比较于深度优先算法,广度优先的难度大致一样,我来总结以下几点

        1.广度优先算法的算法步骤

        2.广度优先算法与深度优先算法的区别

        3.广度优先算法的算法实现 

        🚇下一站:B,B+,B*的介绍与图的创建

  • 34
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 43
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爪哇土著、JOElib

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值