文章目录
BFS算法
BFS算法框架
BFS算法是利用队列实现的一种搜索算法。逐层向下遍历,从一个点像四周扩散(将可选节点存放于队列中,删除已被使用的节点),使用队列完成操作,通常用于最短路径的寻找。
单向队列
void BFS(Node root,int target)
{
// 1、两个队列,分别用于存储起始节点和已访问过的节点
queue<Node> q;
unordered_set<Node> visited;
// 2、将最初的起始节点放入队列,状态更新
q.push(root);
visted(root);
int step; // 记录步数
// 3、遍历队列中的所有可能作为起始的节点
while (!q.empty()) {
int sz = q.size();
// 4、当前队列中的所有节点为同一扩散层级
for (int i = 0; i < sz; ++i) {
// 5、每次读取队列顶端节点,进行相应的判断,并从队列中弹出
Node cur = q.top();
q.pop();
// 6、判断当前该节点是否为最终目标,满足条件return
if (cur == target) {
return step;
}
// 7、当前节点满足条件,将其子节点放入队列中存储,在下一次循环(扩散)时进行读取
for (Node &e : Graph[root]) {
// 8、边界判断,其子节点是否越界、已被访问以及其他限制条件
if(visited.find(e) != visited.end()) {
q.push(e);
visited.insert(e);
}
}
}
step++;
}
}
上述为单向BFS算法模板,可以提炼为7个步骤:
1、定义两个队列q和visited,分别用来存储可作为起始的节点和已被访问过的节点
2、将最开始的起始节点放入队列q,并在visited中更新其状态
3、遍历能作为起始节点的队列q(while循环队列)
4、对当前同一层节点进行遍历(对应for循环)
5、每次读取队列顶端节点,进行相应的判断,并从队列中弹出
6、判断当前节点是否为最终目标,满足条件return
7、当前节点满足条件ÿ