C++ 算法学习——1.3 双向广度优先搜索

双向广度优先搜索算法步骤:

  1. 初始化

    • 从起始节点开始,分别初始化两个队列 q_forwardq_backward
    • 将起始节点分别放入这两个队列中。
    • 初始化两个集合 visited_forwardvisited_backward 用于记录已访问的节点。
  2. 循环

    • 在循环中,分别从 q_forwardq_backward 中取出一个节点进行扩展。
    • 对于 q_forward,从当前节点开始探索其相邻节点,并将未访问过的相邻节点加入到 q_forward 中。
    • 对于 q_backward,从当前节点开始探索其相邻节点,并将未访问过的相邻节点加入到 q_backward 中。
    • 在每次扩展节点时,检查两个队列中是否存在相同的节点,如果存在则找到了一条双向路径。
    • 如果找到双向路径,停止搜索并合并两个路径。
  3. 终止条件

    • 当两个队列中存在相同的节点,或者两个队列中的节点都被完全探索过后,算法终止。

C++代码示例:

#include <iostream>
#include <queue>
#include <unordered_set>
#include <vector>using namespace std;// 双向广度优先搜索
bool bidirectional_bfs(vector<vector<int>>& graph, int start, int target) {queue<int> q_forward, q_backward;unordered_set<int> visited_forward, visited_backward;q_forward.push(start);q_backward.push(target);visited_forward.insert(start);visited_backward.insert(target);while (!q_forward.empty() && !q_backward.empty()) {// 扩展正向队列int curr_forward = q_forward.front();q_forward.pop();for (int neighbor : graph[curr_forward]) {if (!visited_forward.count(neighbor)) {visited_forward.insert(neighbor);q_forward.push(neighbor);}if (visited_backward.count(neighbor)) {cout << "Path found!";return true;}}// 扩展反向队列int curr_backward = q_backward.front();q_backward.pop();for (int neighbor : graph[curr_backward]) {if (!visited_backward.count(neighbor)) {visited_backward.insert(neighbor);q_backward.push(neighbor);}if (visited_forward.count(neighbor)) {cout << "Path found!";return true;}}}cout << "Path not found!";return false;
}

上为邻接表形式,接下来给出矩阵形式:

#include <iostream>
#include <queue>
#include <unordered_set>
#include <vector>
using namespace std;
int rows,cols;void showcurboard(int** boa){for(int i=0;i<rows;i++){for(int j=0;j<cols;j++)cout<<boa[i][j];cout<<endl;}
}struct Coordinate {int x;int y;Coordinate(int _x, int _y) : x(_x), y(_y) {}
};
struct PairHash {template <class T1, class T2>std::size_t operator () (const std::pair<T1, T2> &pair) const {auto hash1 = std::hash<T1>{}(pair.first);auto hash2 = std::hash<T2>{}(pair.second);return hash1 ^ hash2;}
};
vector<pair<int, int>> directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
bool bidirectional_bfs(int** matrix, int begina, int beginb, int enda, int endb) {queue<Coordinate> q_forward, q_backward;unordered_set<pair<int, int>, PairHash> visited_forward, visited_backward;q_forward.push(Coordinate(begina, beginb));q_backward.push(Coordinate(enda, endb));visited_forward.insert({begina, beginb});visited_backward.insert({enda, endb});while (!q_forward.empty() && !q_backward.empty()) {Coordinate curr_forward = q_forward.front();q_forward.pop();for (auto& dir : directions) {int new_x = curr_forward.x + dir.first;int new_y = curr_forward.y + dir.second;if (new_x >= 0 && new_x < rows && new_y >= 0 && new_y < cols && visited_forward.count({new_x, new_y}) == 0) {visited_forward.insert({new_x, new_y});if (visited_backward.count({new_x, new_y}) > 0) {return true;}q_forward.push(Coordinate(new_x, new_y));}}Coordinate curr_backward = q_backward.front();q_backward.pop();for (auto& dir : directions) {int new_x = curr_backward.x + dir.first;int new_y = curr_backward.y + dir.second;if (new_x >= 0 && new_x < rows && new_y >= 0 && new_y < cols && visited_backward.count({new_x, new_y}) == 0) {visited_backward.insert({new_x, new_y});if (visited_forward.count({new_x, new_y}) > 0) {return true;}q_backward.push(Coordinate(new_x, new_y));}}}return false;
}int main()
{int a,b;cin>>rows>>cols>>a>>b;int** board=new int*[rows];for(int i=0;i<rows;i++){board[i]=new int[cols];fill(board[i],board[i]+cols,0);}//showcurboard(board);return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装和配置k8s可视化UI界面dashboard-1.20.6

安装和配置k8s可视化UI界面dashboard-1.20.6 1.环境规划2.初始化服务器1&#xff09;配置主机名2&#xff09;设置IP为静态IP3&#xff09;关闭selinux4&#xff09;配置主机hosts文件5&#xff09;配置服务器之间免密登录6&#xff09;关闭交换分区swap&#xff0c;提升性能7&…

2024入门测参考答案(c语言版)

先自己看代码思考&#xff0c;不理解的地方可以截图私聊…… 7-1 祝福祖国&#xff01; 这是一个编程题模板。 2024年即将到来&#xff0c;作为一名大学生&#xff0c;为了表达在新的一年里&#xff0c;对祖国的祝福&#xff0c;请编写程序输出祝福语&#xff1a;在新的一年…

配置WSGI 服务器(Gunicorn)和Nginx 反向代理服务器部署Flask项目

部署 Flask 项目涉及到多个步骤&#xff0c;包括环境设置、依赖管理、配置、Web 服务器配置、数据库管理等。下面是一个详细的部署指南&#xff0c;假设你使用的是 Linux 系统&#xff08;如 Ubuntu&#xff09;。 前三个步骤教你如何在python虚拟环境下搭建项目并给出项目结构…

QT QML 练习8-Simple Transformations

简单的转换&#xff08;Simple Transformations&#xff09; 转换操作改变了一个对象的几何状态。QML元素对象通常能够被平移&#xff0c;旋转&#xff0c;缩放。下面我们将讲解这些简单的操作和一些更高级的用法。 我们先从一个简单的转换开始。用下面的场景作为我们学习的开始…

Qt- QSS风格选择器常用属性选择器样式表盒子

1. 风格设置 Qt 提供了 3 种整体风格&#xff0c;使用 QStyleFactory::keys() 来获取 &#xff08;windowsvista 、Windows 、Fusion&#xff09; 可以在 main.cpp 中调用 setStyle 方法对应用程序进行全局风格的设置 int main(int argc, char *argv[]) {QApplication a(arg…

Redis协议详解及其异步应用

目录 一、Redis Pipeline&#xff08;管道&#xff09;概述优点使用场景工作原理Pipeline 的基本操作步骤C 示例&#xff08;使用 [hiredis](https://github.com/redis/hiredis) 库&#xff09; 二、Redis 事务概述事务的前提事务特征&#xff08;ACID 分析&#xff09;WATCH 命…

用Python实现图片转ASCII艺术:图像处理与字符艺术的完美结合

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 ASCII艺术是一种通过字符来表现图像的艺术形式,最早用于早期计算机显示器,它仅支持字符显示。如今,尽管图像分辨率和显示技术得到了极大的提升,ASCII艺术作为一种复古而别具一格的图像表现形式,仍然受到许多…

驱动开发系列21 - 编译内核模块的Makefile解释

一:内核模块Makefile #这一行定义了要编译的内核模块目标文件。obj-m表示目标模块对象文件(.o文件), #并指定了两个模块源文件:helloworld-params.c 和 helloworld.c。最终会生成这 #这两个.c文件的.o对象文件。 obj-m := helloworld-params.o helloworld.o#这行定义了内核…

爱快路由器配置腾讯云动态域名DDNS详细说明

直白点说就是让爱快路由器自动配置当前公网IP地址给域名&#xff0c;动态域名DDNS不清楚的请自行百度&#xff0c; 这里就可以看见操作日志&#xff0c;那么我们一步一步来配置它吧&#xff0c;首先登录爱快路由器&#xff0c;如下图&#xff1a; 那么腾讯云我们怎么找到ID和…

koa知否论坛交流系统的设计与实现---附源码53933

目 录 1 绪论 1.1研究背景 1.2研究意义 1.3论文结构与章节安排 2 知否论坛交流系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4本章小…

Spring Boot环境下的大创项目质量保证系统

3系统分析 3.1可行性分析 通过对本大创管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大创管理系统采用SSM框架&#xff0c;JAVA作为开发语言&#…

鸿蒙OS启动流程

启动流程(基于openharmony4.1) 系统上电加载内核后&#xff0c;按照以下流程完成系统各个服务和应用的启动&#xff1a; 内核加载init进程&#xff0c;一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。init进程启动后&#xff0c;会挂载tmpfs&#xff0c;…

宝塔PHP8.1安装fileinfo拓展失败解决办法

在宝塔面板中安装PHP8.1后&#xff0c;安装fileinfo扩展一直安装不上&#xff0c;查看日志有报错&#xff0c;于是手动来安装也报错。 宝塔报错&#xff1a; 手动命令行编译安装同&#xff0c;也有报错 cd /www/server/php/81/src/ext/fileinfo/ make distclean ./configure …

MongoDB初学者入门教学:与MySQL的对比理解

&#x1f3dd;️ 博主介绍 大家好&#xff0c;我是一个搬砖的农民工&#xff0c;很高兴认识大家 &#x1f60a; ~ &#x1f468;‍&#x1f393; 个人介绍&#xff1a;本人是一名后端Java开发工程师&#xff0c;坐标北京 ~ &#x1f389; 感谢关注 &#x1f4d6; 一起学习 &…

Oracle 数据库中游标的入门到精通

一、游标入门知识 &#xff08;一&#xff09;游标是什么 在 Oracle 数据库中&#xff0c;游标是一种处理结果集的机制。当执行一个查询语句后&#xff0c;结果集可能包含多行数据。游标就像是一个指向这些数据行的指针&#xff0c;允许我们逐行对数据进行操作和处理&#xf…

020 elasticsearch7.10.2 elasticsearch-head kibana安装

文章目录 全文检索流程ElasticSearch介绍ElasticSearch应用场景elasticsearch安装允许远程访问设置vm.max_map_count 的值 elasticsearch-head允许跨域 kibana 商品数量超千万&#xff0c;数据库无法使用索引 如何使用全文检索&#xff1a; 使用lucene&#xff0c;在java中唯一…

MySQL 的数据类型

1.整数类型 1.1 tinyint tinyint 为小整数类型&#xff0c;存储空间为1个字节&#xff08;8位&#xff09;&#xff0c;有符号范围-128 ~ 127&#xff0c;无符号范围 0 ~ 255,此类型通常在数据库中表示类型的字段&#xff0c;如某一字段 type 表示学科,其中 “type1” 表示语文…

什么是芯片正向设计和芯片反向设计?

什么是芯片反向设计&#xff1f;反向设计其实就是芯片反向设计&#xff0c;它是通过对芯片内部电路的提取与分析、整理&#xff0c;实现对芯片技术原理、设计思路、工艺制造、结构机制等方面的深入洞悉&#xff0c;可用来验证设计框架或者分析信息流在技术上的问题&#xff0c;…

C++学习,标准库 <functional>

C 标准库 <functional> 头文件提供了一组函数模板&#xff0c;这些模板允许使用函数对象&#xff08;function objects&#xff09;作为参数传递给算法&#xff0c;或者作为算法的返回值。函数对象是那些重载了 operator() 的对象&#xff0c;它们可以像普通函数一样被调…

004、合并两个有序数组

0、题目描述 合并两个有序数组 1、法1 数组nums1有m个元素&#xff0c; 直接在下标为m的位置处追加nums2的元素。然后再qsort整体排序。 —— —— qsort函数&#xff0c;&#xff08;数组首元素地址&#xff0c;排序的个数&#xff0c;排序元素大小&#xff0c; 比较函数&…