高级农民
- 积分
- 2337
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-6-2
- 最后登录
- 1970-1-1
|
本帖最后由 timzyt 于 2021-8-11 23:15 编辑
- while(!q.empty()){
- int n=q.size();
- for(int i=0; i<n; i++){
- sth = q.front(); q.pop();
- for(auto neb : q.neighbors){
- q.push(neb);
- }
- }
- }
复制代码
楼主您好,以您的这段BFS模板为例。
while中for循环的核心目的是为了给搜索的节点分层。
如果去掉for循环,那这个模板就是普通的BFS搜索,保证图中每个节点和边都被搜索一次,且每个点都是通过最短路径(from root)被找到。(这是BFS的基本性质)
但是,我们并不知道,每个点到root的最短路径是多少。
但是加上这个for循环可以让我们知道,每个点的最短路径(from root)是几。
只需要在代码模板中做一点小小的修改
- int minPathCount = 0;
- while(!q.empty()){
- int n=q.size();
- for(int i=0; i<n; i++){
- sth = q.front(); q.pop();
- std::cout << "Min path from root to node: " << sth << " is " << minPathCount << "\n";
- for(auto neb : q.neighbors){
- q.push(neb);
- }
- }
- minPathCount ++;
- }
复制代码
那么啥时候需要知道最短路径的值呢?举个例子,如果是Numbers of Island,我们只需要运用BFS的“每个节点访问一次”的性质。那我们就不需要给节点分层,也就不需要中间这个for loop。但是如果题目是Word Ladder,那么你需要知道最短距离是几,你就需要用这个带for loop的模板。
|
|