1.关于BFS的Key_word:

①hash或状态压缩记录状态  ②状态剪枝 ③反向BFS ④双向BFS ⑤特殊初始化VIS数组 ⑥动态图的搜索 ⑦优先队列优化搜索 ⑧数位搜索

下面是一一讲解:

1.hash或状态压缩记录状态 :

  当状态太多而且边界也广时数组难以存储状态时或者题目对空间的要求较为苛刻,这时候就要使用状态压缩来保存所需的状态或者hash的方式将一个状态对应为一个整数通过一维数组来记录是否访问,当数据过于离散时可以考虑使用map,但是相应的时间复杂度也会上升,如果真的要将所有状态限定在一个较小的范围,可以使用双hash,不过一般的状态相对来说不会太难表示,而是考察对于每个搜索状态的如何设计转移,有点像DP,谁让DP搜索不分家。

2.状态剪枝:

  没有剪枝的搜索是没有灵魂的,无论DFS还是BFS,对于DFS而言我们是一层一层的寻找,当我们知道某一子树不可能找的结果,或者说这一状态在具有更有条件时访问过便不再扩展,但是并不代表着,我小于当前最优解就意味着我的子树中不存在最优解,这一段的说明见⑦。但是剪枝需要严谨的证明过程,盲目的剪枝不可取,要根据题目具体设计在状态转移中的剪枝条件,这个在BFS中没有什么规律可循,每一道题都意味着你需要在题目中发掘隐含条件进行剪枝,例如:当到达同一状态时,Dis1<Dis2,那么显而易见,Dis2的后续就要被剪掉,因为在这一点具有同样的转移的后续,但是在这一点有最优的选择,且最优选择的结果一定好于所有其他选择,那么进行剪枝,那么会发现只有着明确的相似关系,且有着明显的先后优劣状态的状态需要剪枝,但是在题目中很难找到一眼可以剪枝的关系,这就需要进一步的推导与证明,当这一点学好之后,对于DP的学习会发现,经过各种剪枝的搜索就是DP,不采取递归手段访问每一可能的状态。

3.反向BFS:

  例如,在一个迷宫中有N个人,请找出最快走出迷宫的那个人? 那么我们正向考虑问题,对于N个人那么他们快走出迷宫的话需要求N次BFS,比较步数,那么当N大到一定程度时,爆栈,不需要很大图就会爆栈,那么反向考虑,我们换种问法,迷宫中有一个人,有N个出口,请问他最快从哪个出口中走出?   如果这么问,我们一定会思路泉涌,但是题目绝对不会出这么简单地变换,我们在改造一下这个问题,有N个人M个出口的题目我们该如何解决,一种解决方法是建图,Floyd求最短路比较大小时间复杂度为O((N+M)^3+(N+M)^2), 我们这里给出BFS的方式,至于时间复杂度只能说随缘,但是思路何尝不是一个好思路,我们先比较N和M的大小,通过小的作为搜索起点,那么我们第一次搜索的Dis设置为最优解,第二次搜索时若大于Dis还无解,一定无解,跳出,通过不断搜索的不断更新最优解的方式搜索复杂度应该在 O(MIN(N,M)*ans)——O(MIN(N,M)*dis first)之间,那么遍历图上的任何点的时间为(N+M)^2,在乘以min(N,M),那么时间复杂度最大是个(N+M)^2*Min(n,m),对于时间复杂度一定优于第一种,对于其他的方法可以使使用队列优化的dijkstra,O((N+M)*Log(N+M)*min(N,M))的复杂度,对于更好的方法现在,我还不太清楚,当然最短路不在我们的讨论范围内,因为有些情况是不能处理的,访问与后续,所以稍稍改动就只能使用BFS。

4.双向BFS

无论从ans还是从start开始扩展,都以几何的趋势增长无论从哪一方开始搜索都会爆栈,但是ans与start之间的路很少,通过双向搜索找到中间点这种方式绝对会更加快速,图比较丑也不太形象,但大体的思想还是表现出来。适用于状态转移方向太多,但是距离较短的的情况。

5.特殊化的VIS数组

对于一张图我们vis=1时为访问,vis=0时为未访问,第二次用的时候就需要memset,但是时间太长,我们换一种思想,对于vis=n时,为访问过,vis!=1为未访问,那么如果vis中的没有N的话那就不用初始化了,那么对于第一遍之后的vis数组之后1或0,那么我们使n=2,即可不用初始化,第三遍时等于3,以此类推。

6.动态图的搜索

图的情况会随时间轴改变,那么需要在状态的维度中增加一个时间维度,而且不同时间的状态不同,同状态不同时间理解为不同的状态,那么对于动态图的搜索,不能简单vis数组,而是要记录时间轴,状态的叠加。

7.优先队列搜索

对于优先队列优化的搜索,必须要证明当前的最优解的扩展一定比不是最优解的扩展要优,即当前不是最优未来一定不是最优。不然使用优先队列优化的搜索必错。

8.数位搜索

这个搜索虽然写到这,不是需要注意什么,而是说数位搜索很基础,不太好像,但是一定能做。更多的是K进制数,用除法求余什么。比如一个500位的数,怎么取模?

想想小学的除法算式怎么写? 不是一位一位的除吗?多少位的也可以做。

图论--BFS总结的更多相关文章

  1. 数据结构之 图论---bfs(邻接表)

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...

  2. CF986A Fair【图论/BFS】

    [题意]: 有些公司将在Byteland举办公平的会议.Byteland的n个城镇,m条两镇之间的双向道路.当然,你可以使用道路从任一个城镇到达任何城镇. 有k种商品产自Byteland,并且每个城镇 ...

  3. 图论-BFS解无权有向图最短路径距离

    概述 本篇博客主要内容: 对广度优先搜索算法(Breadth-First-Search)进行介绍: 介绍用邻接表的存储结构实现一个图(附C++实现源代码): 介绍用BFS算法求解无权有向图(附C++实 ...

  4. 图论 --- BFS + MST

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7844   Accepted: 2623 Descrip ...

  5. 算法基础⑦搜索与图论--BFS(宽度优先搜索)

    宽度优先搜索(BFS) #include<cstdio> #include<cstring> #include<iostream> #include<algo ...

  6. CodeForces Round #285 Div.2

    C.Misha and Forest (图论 BFS) 比赛进行了一半才想起来有场CF没打,=_=|| 前两道题快速切掉,C题一直卡没什么好的思路 憋了几天,忍不住偷偷瞄了一下别人AC的代码,发现我题 ...

  7. 图论算法之DFS与BFS

    概述(总) DFS是算法中图论部分中最基本的算法之一.对于算法入门者而言,这是一个必须掌握的基本算法.它的算法思想可以运用在很多地方,利用它可以解决很多实际问题,但是深入掌握其原理是我们灵活运用它的关 ...

  8. SDUT OJ 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)

    数据结构实验之图论五:从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss P ...

  9. NOJ——1642简单的图论问题?(BFS+优先队列)

    [1642] 简单的图论问题? 时间限制: 5000 ms 内存限制: 65535 K 问题描述 给一个 n 行 m 列的迷宫,每个格子要么是障碍物要么是空地.每个空地里都有一个权值.你的 任务是从找 ...

随机推荐

  1. (js描述的)数据结构[树结构1.1](11)

    1.树结构: 我们不能说树结构比其他结构都要好,因为每种数据结构都有自己特定的应用场景. 但是树确实也综合了上面的数据结构的优点(当然有点不足于盖过其他的数据结构,比如效率一般情况下没有哈希表高) 并 ...

  2. 通过powershell查询OU中被禁用的AD账号,并删除他们的所属组

    这个需求可以通过两个方向来实现1.找到禁用的账号,删除除domain users外的所有组,脚本内容如下 #导入AD模块import-module ActiveDirectory #被禁用户$user ...

  3. vue 本地调试跨域---带cookies(axios)

    cookise跨域第二期之便捷优雅的本地调试(axios) 1.打开config/index.js,在proxyTable中添写如下代码: proxyTable: { '/agent': { //使用 ...

  4. 2019-07-31【机器学习】无监督学习之聚类 K-Means算法实例 (图像分割)

    样本: 代码: import numpy as np import PIL.Image as image from sklearn.cluster import KMeans def loadData ...

  5. ATcoder E - Flatten 质因子分解求LCM

    题解:其实就是求n个数的lcm,由于数据特别大,求lcm时只能用质因子分解的方法来求. 质因子分解求lcm.对n个数每个数都进行质因子分解,然后用一个数组记录某个质因子出现的最大次数.然后累乘pow( ...

  6. 65535与TCP连接数的关系测试结论

    首先说结论: .是否有关系 .有关系 对于客户端 -.对于客户端来说,只有65535,因为根据TCP四元组的sport来说,sport只有16位,所以(2^16)-1是65535.也就是最多有6553 ...

  7. PHP本地开发利器:内置Web Server

    PHP 5.4.0起, CLI SAPI 提供了一个内置的Web服务器. 命令:php -S 这个内置的Web服务器主要用于本地开发使用,不可用于线上产品环境. URI请求会被发送到PHP所在的的工作 ...

  8. 关于vue切换用户,路由表不更新问题

    简介 我想很多同学在项目中可能会遇到类似的问题,然后一顿操作,发现结果不尽人意.于是查阅各种资料,走进很多坑(可能你阅读的这篇随笔也是个坑).接下来我所描述的是关于我使用不同权限的用户切换登陆后,需要 ...

  9. [javascript] jquery的父子兄弟节点查找

    jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(&q ...

  10. kubernetes的Service是什么?

    service到底是什么? k8s的service定义了一个服务的访问入口地址,前端的应用通过这个入口地址访问其背后的一组由pod副本组成的集群实例.来自外部的访问请求被负载均衡到后端的各个容器应用上 ...