BFS算法模板

本文详细介绍了BFS(广度优先搜索)算法,包括单向队列和双向队列的应用,并提供了leetcode上的典型习题如127单词接龙和139单词拆分的实践,还给出了多个额外的练习题目,帮助读者巩固BFS算法的理解和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、当前节点满足条件ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值