Introduction
Breadth First Search(Queue实现)
1.BFS在graph和Binary Tree中的区别:
graph中的BFS除了Queue还需要HashSet/HashMap--避免重复在undirected graph
经典图中的BFS:P618
经典二叉树上的BFS:LeetCode 102
2.BFS应用:给出一个点,在graph中找到所有点(参数只给一个点)
2.BFS应用:A到B是否可行
2.BFS应用:求图里的最短路径(简单图-无向无权图)
PS:用DFS不是最优,recursion会产生stackoverflow
3.棋盘问题(graph)
能向下走向右走--Dynamic Programming
四个方向都能走--BFS
4.Time Complexity
O(m+n)--m是点数,n是边数
O(2m+2n) 每个点就被访问两次(进入queue,hashset一次,出queue一次),每条边被访问2次。
5.Topological sorting(拓扑排序)--有可能0~多个
有向图-->不能有环-->有可能为0个(有相互依赖)
所以,不是所有的有向图都能够被拓扑排序,因为它中间存在互相依赖的关系,从而无法确定谁先谁后。在有向图中,这种情况被描述为存在环路。因此,一个有向图能被拓扑排序的充要条件就是它是一个有向无环图(DAG:Directed Acyclic Graph)
图的三种表示方式:边表示法,邻接表法,邻接矩阵。用邻接表存储图比较方便寻找入度为0的节点。
BFS解法:能否找到一个有向数列 (Leetcode 207)
在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在)。
统计所有点的入度(建立入度数组)
把所有入度=0的点放入队列
从这个队列开始BFS
然后开始遍历队列,从graph里遍历其连接的点,每到达一个新节点,将其入度减一,如果此时该点入度为0,则放入队列末尾。
直到遍历完队列中所有的值,若此时还有节点的入度不为0,则说明环存在,返回false,反之则返回true
6.在图中设置障碍的路径问题
P611,P598
Last updated