图论 —— 图的搜索
【概述】
图的搜索问题,是给出一个抽象的字符矩阵代表一张图,根据根据题目要求,对图进行搜索,关于搜索算法:点击这里
根据搜索方法的不同,分为深度优先遍历(DFS)、广度优先遍历(BFS),两者时间复杂度都是 O(N*N),通常采用深度优先遍历。
【深度优先遍历】
图的深度优先遍历的基本过程为:
- 从图中某个顶点 v0 出发,首先访问 v0
- 访问结点 v0 的第一个邻接点,以这个邻接点 vt 作为一个新节点,访问 vt 所有邻接点,直到以 vt 出发的所有节点都被访问
- 回溯到 v0 的下一个未被访问过的邻接点,以这个邻结点为新节点,重复步骤 2,直到图中所有与 v0 相通的所有节点都被访问
- 若此时图中仍有未被访问的结点,则另选图中的一个未被访问的顶点作为起始点,重复步骤 1,直到图中的所有节点均被访问
其基本框架为:
int vis[N];
void DFS(int i) {for(所有i的邻接点j) {if(!vis[j]) {if(j == 目标状态)return true;vis[j]=true;dfs(j);}}
}
【广度优先遍历】
图的广度优先遍历的基本过程为:
- 从图中某个顶点 v0 出发,首先访问 v0,将 v0 加入队列
- 将队首元素的未被访问过的邻接点加入队列,访问队首元素并将队首元素出队,直到队列为空
- 若此时图中仍有未被访问的结点,则另选图中的一个未被访问的顶点作为起始点,重复步骤 1,直到图中的所有节点均被访问过。
其基本框架为:
bool vis[N];
void BFS(int start) {queue<int> Q;Q.push(start);vis[s]=true;while(!Q.empty()) {int x=Q.front();Q.pop();if(x==目标状态) {...}for(所有i的邻接点j) {if(!vis[j]) {Q.push(j);vis[j]=true;}}}
}
【奇偶剪枝】
对于给出的字符矩阵,在搜索过程中,利用奇偶剪枝能极大的降低时间复杂度。
1.内容
假设起点为(sx,sy),终点为(ex,ey),给定 t 步恰好走到终点,如图所示(“|”竖走,“—”横走,“+”转弯),易证 abs(ex-sx)+abs(ey-sy) 为此问题类中任意情况下,起点到终点的最短步数,记做 step,此处 step1=8;
如图,为一般情况下非最短路径的任意走法举例,step2=14;step2-step1=6,偏移路径为 6
推广:若 t-[abs(ex-sx)+abs(ey-sy)] 结果为奇数,则无法在 t 步恰好到达,返回 false;反之,若结果为偶数,则可以在 t 步恰好到达,返回 true。
2.应用
如图,没障碍物#时,S到E的最短路长为6,但是当有障碍物时,就要绕行了。
如图,黑色为最短路径,当他绕行(红色加蓝色部分)时,其中蓝色部分其实还是最短路径部分平移来的,所以多走的步数也就是红色部分。对于红色部分我们可以分为两部分,一部分是远离最短路径的步数,另一部分是回到最短路径的部分,他们一定是对称的,所以多走的步数一定是偶数。
所以,当问走 x 步能否到达 e,就算出最短路径长 y,如果 x-y 是偶数就能到达,否则不能到达。
【例题】
1.深度优先遍历
- 红与黑(信息学奥赛一本通-T1216):点击这里
同题:Red and Black(HDU-1312):点击这里 - 迷宫(洛谷-P1605):点击这里
- 迷宫(信息学奥赛一本通-T1215):点击这里
- 花生采摘(洛谷-P1086):点击这里
- LETTERS(信息学奥赛一本通-T1212):点击这里
- 棋盘问题(信息学奥赛一本通-T1217):点击这里
- Avoid The Lakes(POJ-3620):点击这里
- Cat Snuke and a Voyage(AtCoder-2660):点击这里
- Applese 走方格(2019牛客寒假算法基础集训营 Day4-B):点击这里
- Pusher(HDU-2821):点击这里
- 填涂颜色(洛谷-P1162):点击这里
- 01迷宫(洛谷-P1141)(记忆化):点击这里
- Tempter of the Bone(HDU-1010)(奇偶剪枝):点击这里
2.广度优先遍历
- 仙岛求药(信息学奥赛一本通-T1251):点击这里
- 走迷宫(信息学奥赛一本通-T1252):点击这里
- 走出迷宫(信息学奥赛一本通-T1254):点击这里
- 献给阿尔吉侬的花束(信息学奥赛一本通-T1256):点击这里
- 围成面积(信息学奥赛一本通-T1359):点击这里
- 迷宫(2019牛客寒假算法基础集训营 Day6-J):点击这里
- The Castle(信息学奥赛一本通-T1250):点击这里
- Fennec VS. Snuke(AtCoder-2655):点击这里
- Rescue(HDU-1242)(终点找起点):点击这里
- Catch him(HDU-2351)(块状bfs):点击这里
- 迷宫问题(信息学奥赛一本通-T1255)(递归输出):点击这里
- Navigating the City(POJ-2435)(通过队列输出):点击这里
- Dungeon Master(信息学奥赛一本通-T1248)(三维bfs):点击这里
- Applese 走迷宫(2019牛客寒假算法基础集训营 Day4-C)(三维bfs):点击这里
- 炫酷迷宫(2019牛客寒假算法基础集训营 Day5-C)(构造+bfs):点击这里
- 机器人搬重物(洛谷-P1126)(预处理):点击这里
- Lilypad Pondg(POJ-3171)(两次bfs+预处理):点击这里
- The Grove(POJ-3182)(射线法):点击这里
- Meteor Shower(POJ-3669)(起点的处理):点击这里
图论 —— 图的搜索相关推荐
- 题目2:隐式图的搜索问题(A*算法解决八数码)
数据结构课程实践系列 题目1:学生成绩档案管理系统(实验准备) 题目2:隐式图的搜索问题(A*算法解决八数码) 题目3:文本文件单词的检索与计数(实验准备) 文章目录 数据结构课程实践系列 题目1:学 ...
- matlab数据游标属性设置,将节点属性添加到图论图数据提示
绘制具有数据提示的 GraphPlot 对象 创建随机有向图的 GraphPlot 图对象.将额外的节点属性 wifi 添加到该图. rng default G = digraph(sprandn(2 ...
- 数据结构之图:图的搜索,Python代码实现——23
图的搜索 深度优先搜索(Depth First Search) 定义 从例子出发理解 DFS是一种用于遍历或搜寻树类或图类数据结构的算法,这种算法从根结点出发(如果是图,则任意选择一个顶点作为根结点) ...
- 深度搜索和广度搜索领接表实现_数据结构与算法--图的搜索(深度优先和广度优先)...
数据结构与算法--图的搜索(深度优先和广度优先) 有时候我们需要系统地检查每一个顶点或者每一条边来获取图的各种性质,为此需要从图的某个顶点出发,访遍图中其余顶点,且使得每一个顶点只被访问一次,这个过程 ...
- 图论 —— 图的连通性 —— Tarjan 求强连通分量
[概述] Tarjan 算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树. 搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量. [ ...
- 南华大学计算机学院吴取劲,一种基于图深度优先搜索的基本路径集自动生成优化算法-南华大学学报.PDF...
26 3 ( ) Vol. 26 No. 3 第 卷第 期 南华大学学报 自然科学版 2012 9 Journal of University of South China (Science and ...
- 数学建模之图论——图与网络模型(一)(基本概念和最短路问题,附MATLAB源码)
图与网络的基本概念与数据结构 一.图与网络的基本概念 图论中图是由点和边构成的,可以反映一些对象之间的关系. 无向图 无向图(简称图):没有方向,由点和边构成的图,记做G =(V , E),点是V,边 ...
- 生成图-深度优先搜索/宽度优先搜索
问题提出: 考虑如下图所示的简单图所表示的缅因州的道路系统.在冬天里保持道路通路通畅的唯一方式就是经常扫雪.高速公路部分希望只扫尽可能少的道路上的雪,而确保总是存在连接任何两个乡镇的干净道路.如何才能 ...
- 《数据结构课程实践》_02_隐式图的搜索问题_准备工作
02_隐式图的搜索问题_准备工作 一.实验题目与要求 二.编程语言以及开发环境 三.实验思路 A*算法 四.预习小结 一.实验题目与要求 实验要求: 对九宫重排问题,建立图的启发式搜索求解方法: 用A ...
最新文章
- 02CSS基础选择器
- 两所顶尖大学,签约落地深圳!
- bcb 接收webservice tbytedynarray_文章推荐:基于分集接收技术的可见光接收机前端电路...
- mysql主从复制自增_关于mysql主从复制自增长列
- c++ hashset的用法_C++中set的用法
- Appointment detail page loading never ends in Zeiss
- 用区块链打击假新闻 这可能是最2017年的一件事
- 2019年,最值得期待的科学突破将是?
- niginx反向代理解决前后端跨域问题
- CVPR 2020|超越H.265,中科大使用多帧数据改进视频压缩新方法
- BIO、NIO、AIO入门认识
- 最便宜的那款特斯拉,刚刚喜提“最安全汽车”称号(然后被打脸)
- 关于spring注入
- model.train()和model.eval()
- python排课问题_教育机构如何解决排课问题?
- 百度云盘不限速下载大文件(2021-11亲测有效)
- 【转】Unity 对象池(Object Pooling)理解与简单应用
- 多功能数字时钟(VHDL)
- HDU 3966 Aragorns Story
- idea toggle offline mode
热门文章
- 最后2天,错过等1年,这7本计算机经典图书竟然打折了!
- 百度吹过的牛实现了,你的呢?5本书带你搞定AI前沿技术
- wpf esc key 检测不到_自己动手丰衣足食!想让你的车能检测和识别物体?试试这个实验...
- wordcloud里面设置mask加载不出来词频_一条龙搞定情感分析:文本预处理、加载词向量、搭建RNN
- ant-design-vue 快速入手及常用标签
- 结构与算法(04):排序规则与查找算法
- Django REST framework API开发
- linux 用户、群组及权限操作
- ubuntu安装vmware 64位
- PCL中使用FLANN库(2)