码迷,mamicode.com
首页 > 其他好文 > 详细

图、dfs、bfs

时间:2019-04-10 21:59:36      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:top   简单   random   bfs   point   没有   cal   节点   add   

graph
dfs
bfs

1.clone graph
2.copy list with random pointer
3.topological sorting
4.permutations
5.subsets
6.n queens
7.subsetsII 
8.palindrome partitioning
9.combination sum
10.combination sumII
11.word ladder 
12.word ladderII

 

 

 

克隆图:先克隆点,再克隆边。
宽度优先搜索有模板,以后告诉了图中的一个点,遍历整张图先想到宽度优先搜索
宽度优先搜索一般有个队列
哈希表

一张图一般不会给你整张图,一般给你的是图中的某一个节点

拓扑排序: 度、入度、出度
每次遍历入度为0的点。去掉入度为0点的边,再遍历剩下的图的入度为0的点
本质上还是一个遍历图的问题
用宽度优先搜索,用dfs时间复杂度大
如果多个点入度为0,随便从哪个点开始排都可以,所以可能同一个图出现多个拓扑排序的结果

图的题主要掌握宽度优先搜索


图和树的宽度优先搜索的对比:都使用队列
树是循环左子树和右子树,图是循环整个相邻的点

有些图的遍历用hash表示这个节点有没有被遍历过

 

permutations:搜索问题的模板问题
找所有情况的问题想到用dfs,一般只有dfs才能搜索完所有的情况
dfs搜索树
所有的叶子节点相当于permutations问题的可行解
按照搜索树的思想去实现,每个叶子节点其实就是permutations问题的答案
写代码的时候,按照搜索树的思想去模拟搜索的过程就可以
需要回溯到本层,所以需要删除
递归的方法

permutations求所有的排列情况,subsets求所有的子集

subsets:求子集问题也是另一类模板题
去返回所有解,所有可行性的时候,考虑dfs
想到dfs,就需要构建深度优先搜索树
子集不分顺序
之前选择的元素,下一次就不再选择
这个深度优先搜索树,每个节点都是解
每次遍历是从position向后遍历

 

permutations:
时间复杂度:O(n!)
subsets:
时间复杂度: O(2的n次方)


n queens:一碰到求所有可行性的题,就想到用dfs的方式
转换为permutations问题,不一样的地方在于:每次按照permutations问题放置皇后之后,再写一个check函数,检查在列和对角线上是否有冲突
permutations变形上加了check函数
时间复杂度:O(n!)


subsetsII:需要排序。想把相同的元素排在一起,这样就可以考虑重复的情况。

palindrome partitioning:
与subsets类似,因为subsets也是针对每个值选与不选
时间复杂度:O(2的n-1次方),实际就是 O(2的n次方)

combination sum、combination sumII:求所有满足条件的子集

word ladder:简单图最短路的问题
不可以使用dfs
先用bfs求每个节点到起始节点的距离,然后使用dfs求出所有可行路径



 

图、dfs、bfs

标签:top   简单   random   bfs   point   没有   cal   节点   add   

原文地址:https://www.cnblogs.com/ymjyqsx/p/10686224.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!