算法3A----图搜索
BFS
Metaphor
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKnsEOjV-1601600407770)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201001121901033.png)]
- 在一个草原上,火种向外传播饶绍的过程
- S点是火种,在把自己耗尽前,它会把它周围的一圈点着
- 蓝色的点会像火种一样向外继续扩展,注意不能向内,因为里面已经燃烧尽了
- 前锋面指的是当前被点绕的点构成的面
- 遍历:一个不漏、一个不重
algorithm
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t557NMi0-1601600407772)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201001122311815.png)]
- 难点:如何模拟前锋面
- 由于没有实现完全的并行,执行完当前前锋面中的一个点之后,会把当前点点燃的点加入到前锋面中,但是这些点必须在之前与它父节点同级的点都执行完之后再执行,所以用队列这种FIFO的数据结构存储
- clock:读秒的东西
- 所有的节点初始是undicovered
- discovered是中间态,燃烧殆尽变成visited
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZwky2wO-1601600407773)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201001123113560.png)]
-
if undisconvered,未点燃状态
- 变成点燃装,并入队,
- 在它的父节点和它之间连一条边tree,并标记它的父节点是v
-
else
else 已经是灰烬状态
- 把这条边标记为灰色的边cross
bfs:example
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IsTpQldx-1601600407776)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201001124107766.png)]
- 从start节点开始,并入队
- s点出队,并标记为灰烬,将与s点连接的点依次入队
- a点出队,并标记为灰烬,与它相连的点依次入队,
- c点由于已经点燃,所以是cross边
- 重复下去
BFS:shortest distance/path
- dijstra比喻成网兜,节点是环扣位置,拎网兜的过程,环扣点会逐一被提拉起来
- bfs:从火源传递到的任何一个点,都是最近的道,如果能模仿这种自然过程,就可以找到最短路径
- bfs最后会得到一个bfs tree,火种到任何一个点的唯一路径就是最短路径
BFS:Bipartite graph(bigraph) (二步图)
-
蓝色的点没有内部连边,红色的点有内部连边(只存在男女,不存男男,不存女女)
-
任意起始点,假如刚开始是红色点,下一秒点绕的都是蓝色点
-
下一次再被点燃的是红色点,这样奇数偶数分别出现。
-
cross边分为两类:
- 1.同级的边
- 2.点燃它的父节点
-
一旦出现同级的边,算法就会终止,这种cross边更加致命
graph/tree:eccentricity/radius/center/diameter
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJH60qcs-1601600407777)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927201524852.png)]
-
黄色最远的那条边是偏心距,最晚熄灭的节点
-
最短的黄色边,到的目的点就是圆心
-
圆心的偏心距就是半径
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3PPkfQb0-1601600407779)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927201825607.png)]
-
可能有多个center
-
center数量:
- 1.graph<=n
- 2.tree<=2
Tree diameter(by bfs x2)
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tjRpWFzT-1601600407780)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927202521947.png)]
-
之前讲过的一种分治法
-
上面的方法对于二叉树是很合适且容易理解的,但是对于三叉树,及n叉树,就很麻烦了,此时可以用bfs求解,
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PuNExYq6-1601600407780)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927203526493.png)]
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7qSeDwEp-1601600407781)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927203553617.png)]
-
两次bfs找到的就是直径
knights of the round table
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bUrDsAHs-1601600407782)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201002085422533.png)]
- 国王和骑士打算聚会
- 有多个骑士,找到一个公共点,使得总距离最短,选择一个好地点?
- 马,走日字格,bfs下去,可以把每一天可以到的点标识出来
- 递归完后,中间两张图标识两个骑士可以走到的点的步数,不能走的标识为x,然后把两张图相加,找到相加和最小的就是,累计步数最少的
DFS
- BFS可以并行的走,有伙伴
- dfs只有你自己一个人,只能选择独立的一条,可以选择不同的路径
- 到达一个站点后,会对走过的路撒上荧光剂,走过的边称为tree edge
- 这种方法比较笨,就是一条路走到黑,当构成连边cross后,即无路可走
- 当无路可走后,会回退到上一个父节点,走的无路可走又会回退,反复下去
- 当所有的节点都被遍历过后,即完成了dfs
algorithm(1/2)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ORcX9jvU-1601600407782)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927205156190.png)]
algorithm(2/2)
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fA0ZwwzH-1601600407783)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927205350422.png)]
-
parent一旦设置好后,不会像dijkstra上还会发生变化
-
三种情况
-
1.1试图点燃已经熄灭的点
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-om0rObRE-1601600407783)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927210337050.png)]
-
只会在有向图中出现
-
肯定不会成功
-
1.2 dtime(v) 和dtime(u)的大小关系
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wb5FqwJg-1601600407784)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927211146912.png)]
-
这种是cross边
-
2.正在燃烧的点试图去点燃正在燃烧的祖先
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CUaIx8NO-1601600407784)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927210729411.png)]
-
往回撤的路径:目前是红色的点所连接成的边
-
此处就是backward
-
每当有back edge出现时,都会出现一个circle,一个loop
-
当年的燃烧点指向燃尽点的不是一个circle
parenrhesis lemma
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOl6gzUT-1601600407785)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927211822108.png)]
-
a点出发是森林,d点出发是一个独立二叉树
-
蓝色宽边是活跃期,是火险活着的时候
-
bfs这个舞台时常上演白发人送黑发人的情况
-
直系血缘关系,就是看时间活跃期是否有重叠,有就是直系,没有就是旁系
拓扑排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o7w0Z1vw-1601600407785)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201002085904998.png)]
- 每一个都是从前指向后,是顺毛,不会拉手
topological sorting : in-degree
-
需要找到零入度的点,即没有前置条件
-
-
图中的A、B点就是零入度
-
如果一个图中没有零入度的点,必然是有环的,必然是不可行的
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nqxLQoue-1601600407787)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927213329274.png)]
-
学完一个零入度的点,就把它遗忘(入栈),然后去找下一个零入度的点,重复这个过程
topological sorting : out-degree + dfs
-
-
D、F点就是出度为0的点,此时倒过来想的开始的点
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ciXXE3vC-1601600407788)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927213805702.png)]
-
第一次回溯的点
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UeecjcRn-1601600407788)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927214348659.png)]
-
以终为始,与正向走的结果有相同的,说明方法是正确的
BCC:bi-connectivity/cut-vertex
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oizamkzG-1601600407789)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927214711610.png)]
-
D、E没有了会破坏系统的连通性
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iPihOFIr-1601600407790)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927214835960.png)]
-
双连通分量
利用dfs来找到bcc
-
对于叶子节点
-
对于任选的根节点
- 1.root的出度为1
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XcQLZDae-1601600407790)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927215609537.png)]
- 一定不是cut-vertex
- 2.root的出度大于等于2
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PF4wBUlE-1601600407791)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927215635412.png)]
- 一定是cut-vertex
-
对于中间节点
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMRZhzR7-1601600407791)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927220537871.png)]
-
对于某些中间节点,它backward的程度有限,需要考虑一个指标hca(v),最高能够到的祖先(highest connectivity ancestor)
-
与dfs的区别
- undiscovered:
- 递归的是bcc
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3P5S54B9-1601600407792)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927221109840.png)]
- 与dfs不同的是显示维护了一个栈
- hca(u) 和 dTime(v)
- 如果hca(u)>dTime(v),会形成一个bcc,
- discovered
- 指向祖先的边
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7RB9DQ07-1601600407792)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927221735655.png)]
- default
- bcc中cross无意义
- undiscovered:
bcc例子
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iv9bB6tz-1601600407793)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927222054308.png)]
- hdc就是一个bcc
- 更为完整的是包含f的
- 发现f并不在c的下面