首页 > 其他分享 >005 BFS_广度优先搜索

005 BFS_广度优先搜索

时间:2023-05-29 22:22:29浏览次数:143  
标签:cur temp int nullptr BFS que 005 visited 广度

核心就是利用队列
Q: 如何区分下一层?
A: 将当前队列中的所有节点进形扩散

框架

// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node target) {
    Queue<Node> q; // 核心数据结构
    Set<Node> visited; // 避免走回头路

    q.offer(start); // 将起点加入队列
    visited.add(start);
    int step = 0; // 记录扩散的步数

    while (q not empty) {
        int sz = q.size();
        /* 将当前队列中的所有节点向四周扩散 */
        for (int i = 0; i < sz; i++) {
            Node cur = q.poll();
            /* 划重点:这里判断是否到达终点 */
            if (cur is target)
                return step;
            /* 将 cur 的相邻节点加入队列 */
            for (Node x : cur.adj()) {
                if (x not in visited) {
                    q.offer(x);
                    visited.add(x);
                }
            }
        }
        /* 划重点:更新步数在这里 */
        step++;
    }
}

BFS 可以找到最短距离,但是空间复杂度高,而 DFS 的空间复杂度较低。

111. 二叉树的最小深度

class Solution {
public:
    int minDepth(TreeNode* root) {

        if(root==nullptr)  return 0;

        queue<TreeNode*> que;   //重点
        set<TreeNode*> visited;

        que.push(root);  //根节点入队
        int res = 1;    //记录扩散的步数

        while(!que.empty())
        {
            //扩散
            int size = que.size();  //先记录下来,后面会变
            for(int i = 0;i<size;i++)
            {
                TreeNode* temp = que.front();
                //左子节点都空, 返回当前深度(根节点不算叶子节点)
                if(temp->left==nullptr&&temp->right==nullptr)  return res;
                //否则左右子节点入队
                if(temp->left!=nullptr)  que.push(temp->left);
                if(temp->right!=nullptr)  que.push(temp->right);
                //出队
                que.pop();
            }
            //深度+
            res++;
        }
        return res;
    }
};

标签:cur,temp,int,nullptr,BFS,que,005,visited,广度
From: https://www.cnblogs.com/Long23/p/17441859.html

相关文章

  • hdu 3681(bfs+dfs+状态压缩)
    解题思路:这道题属于图上来回走的问题,可以把重复走的过程弱化,即只强调从u->v的结果,中间经过的节点都不考虑。这道题里面'G','F','Y'是重要的节点,其余的点我们是可以忽略的,也就是说,假设从u->v,我们只需要知道最短路径是多少就可以了,至于是怎么走的,中间绕过了多少个'D'都不是我们关心的......
  • hdu 4012(bfs+位压缩)
    思路:每次涂色以后必有一个格子的颜色是最终的颜色,否则这次涂色根本没意义,所以我们把每次涂色后哪些格子成为最终颜色的所有可能都入队,入队的元素是一个struct包含步数和最终颜色已确定的木块集合,这个集合必须用整数表示,所以用到状态压缩,因为最多只有16个格子,所以用16位的二进制来表......
  • poj 2415(BFS)
    题意: 有一种游戏,共有三个piece(不妨称为棋子),棋盘是由N个点构成的完全图,边有颜色。每次可以移动一个棋子,移动时必须满足棋子走过的边的颜色和其他两个棋子之间的连边的颜色一致。求把三个棋子移到同一个顶点的最少次数。这道题是一个很简单的BFS,但为何一直TLE。。。。#include<ios......
  • poj 1324(BFS+状态压缩)
    解题思路:这道题一开始的想法就是状态压缩,即考虑如何判重,由于蛇并非是直线的,所以想到了以每一个点的上下左右共四个值来表示相对位置。最开始想如何用四进制来表示它,无语。。。。。还是题目做少了,直接用两位来表示一个点即可(两位的二进制数可以表示0-3)。剩下的关键就是判断蛇头会不......
  • git 查看文件修改前和修改后的区别:005
    命令:girdiffgirdiff--staged 1.查看某个文件修改了哪些内容,后者是查看所有文件都修改了哪些内容(注意:这是查看未追踪的文件的)gitdiff文件名gitdifff 2.查看(已追踪但未提交)的文件修改差异gitdiff--staged ......
  • 广度优先搜索+状态压缩
    1.滑动谜题2.转化为全零矩阵的最少反转次数3.推箱子......
  • [AHOI2005]约数研究
    没错,数学也有分类了qaq,我之前学算法的时候妹学数学,今天算是被搞怕了(但还是不听ovo)学会了两种方法,主要思想还是,对于每个i来说,他在从1-n中的贡献值是n/i,也就是1-n中约数含有它的数目是n/i(厉害吧,刚学的)另外一种方法是筛法,说实话这个你应该想到的(恼),不优化会爆的(30分......
  • 安装LoadRunner时提示“此计算机上缺少 vc2005_sp1_with_atl_fix_redist”的解决方法
    我的电脑在安装UFT时,被要求需要卸载本机上安装的LoadRunner11,当LoadRunner11被卸载后,进行重新安装LoadRunner11时,会报缺少vc2005_sp1_with_atl_fix_redist错误,类似下图所示:由提示信息可知,这里是由于本机缺少该组件所致,解决方案就是安装此组件,可以去网上下载,当然,我们完全没有必......
  • POJ 2251 Dungeon Master(三维BFS)
    题目看起来很厉害,实际上看懂了并不难,开一个三维的数组,这里需要注意的是第一维是高度,然后就是简单的BFS了,还有不同就是三维的时候有六个方向可以走,在前后左右的基础上多了一个向上和向下的走法,还有一个问题就是多个输入样例要注意每次都要初始化,我做的时候就因为这个WA了好几次,最后......
  • 1005.Django项目用户功能之认证权限以及班级管理
    一、Token1.Token概述在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请,登录系统使用Token、令牌、代表执行某些操作的权利的对象。更通俗点可以叫暗号,在一些数据传输之前,要先对暗号的核对,不同的暗号被授权不同的数据操作。方法:①引入--客户端请求......