个人理解
BFS是一种最简便的图搜索算法,通过遍历整张图直到找到目标节点;
从算法的角度看,所有因为展开节点而得到的字节点会被存储到一个FIFO的数据结构中,被遍历过的节点存储在一个容器中(一般是一个set),防止重复搜索
图解
如图所示,我们想要获取从S到E节点的最短路径,运用BFS,如何处理??
主要思想是:从节点S开始将其所有临近子节点存放到一个队列中,然后标记这些节点到最初顶点S的距离为1;
然后根据队列的先进先出特定,出队列,判断是否为目标节点;如果不是,将出队节点的临近子节点入队,直到队列为空
伪代码
int BFS(Node root, Node target) {
Queue<Node> queue;
Set<Node> set; // 用来存储访问过的节点
queue.add(root);
set.add(root);
int instance = 0; // 标识根节点到目标节点的距离
while(queue is not empty) {
instance++;
int queueSize;
for (index = 0; index < queueSize; index++) {
node = queue.remove(); // 取队列根节点
if (node is target node) {
return instance;
}
add node next nodes in queue; // 将节点的所有临近子节点入队列
}
}
return -1;
}
力扣对应习题
https://leetcode-cn.com/problems/open-the-lock/
https://leetcode-cn.com/problems/perfect-squares/
个人观点 --- 不喜勿喷,欢迎指正,共同学习共同进步
此类算法题的难点在于如何将给定的题目拆解,并应用到BFS中;没有什么捷径,需要深刻理解BFS思想,然后勤加练习吧。