leetcode——BFS图总结

一、基础思想

1、从一个结点出发,遍历其邻接点入队
2、对于访问过的结点要作记录,避免再次访问
3、关键是找到题目中移动一下的遍历方向有几种,是哪些

二、高频题目

133. 克隆图
——DFS
1、特判
2、递归条件,结点访问过,返回map对应的val
3、克隆当前节点
4、遍历当前节点邻居,进行邻居更新,同时邻居克隆
5、返回当前节点
——BFS
1、特判结点为空时,返回nullptr
2、申请哈希表,key用于记录原结点,value用于记录新结点
3、克隆当前结点,放入队列
4、广度遍历,访问队列头的邻居,若未访问过则克隆并加入队列,克隆当前结点的邻居
5、返回克隆后key对应的val

200. 岛屿数量——BFS
1、遍历二维矩阵
2、遇到1时,压入队列,对其进行广度优先遍历(上下左右),并更新为0表示访问过
3、广度优先遍历注意出界,还有压入队列时记得更新为0
4、返回矩阵的广度遍历次数

130. 被围绕的区域——BFS
1、从边缘出发,寻找所有不被包围的O
2、广度优先遍历,若是O且不出界,不断压入队,并将边缘O标记为A
3、遍历矩阵,将O标记为X,将A标记为O

752. 打开转盘锁——BFS,从原始状态遍历八个状态
1、特判 目标状态为初始状态
2、特判 初始状态为死亡数字
3、每位数字可以顺时针或逆时针转,一个转盘锁有个种遍历方向
4、初始状态入栈,并标记为访问过
5、广度优先遍历,若未访问过且不是死亡数字,则进行广度遍历,距离为当前step+1

1091. 二进制矩阵中的最短路径——BFS,从左上角出发遍历八个方向
1、特判 开始结点为不可达
2、特判 结点只有一个
3、初始化队列,压入
4、进行八个方向的广度遍历,弹出时标记访问过,更新为1
5、队列按层为一个step,结果返回step+1

542. 01 矩阵——BFS,从0出发找1
1、将所有0压入队,标记为访问
2、广度遍历,当前值等于前一个值+1
3、最终实现0遍历到其他位置即广度遍历的步数

127. 单词接龙——根据单词建图,遍历图更新距离矩阵
1、申请哈希表作单词到数字索引的映射,申请邻接点记录矩阵
unordered_map<string,int>,vetcor<vector<int>>
2、对开头单词与可转换单词进行建图,加入单词,构建*单词,更新边缘
3、申请对应结点数目的距离矩阵,对开头单词进行广度优先遍历
vector<int> dist(n) 表示n个结点到开头结点的距离
4、若队头为目标单词,返回距离
5、若队头不为目标单词,遍历邻接点,更新距离为当前结点距离到开头距离+1

207. 课程表——拓扑排序
1、构建每个结点的前一个结点链表,记录结点入度
2、将所有入度为0的结点压入队列
3、广度优先遍历,取队头,遍历队头邻接点,邻接点入度-1,若入度变为0压入

三、思考与收获

1、题型有哪些?
从矩阵的某个地方出发,对周围相同元素进行遍历标记
拓扑排序,结点有顺序之分,每次将入度为0的结点压入队中
根据题目所给信息,确定结点,确定结点之间的边缘,进行建图,再作BFS

2、需要注意什么?
注意访问标记的数组,如矩阵可以利用原空间提高空间效率,其他则另外开空间进行标记,如set
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值