算法3A----图搜索

算法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) (二步图)

image-20201001124626306
  • 蓝色的点没有内部连边,红色的点有内部连边(只存在男女,不存男男,不存女女)

  • 任意起始点,假如刚开始是红色点,下一秒点绕的都是蓝色点

  • 下一次再被点燃的是红色点,这样奇数偶数分别出现。

  • 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

  • 需要找到零入度的点,即没有前置条件

  • image-20200927213126361
  • 图中的A、B点就是零入度

  • 如果一个图中没有零入度的点,必然是有环的,必然是不可行的

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nqxLQoue-1601600407787)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927213329274.png)]

  • 学完一个零入度的点,就把它遗忘(入栈),然后去找下一个零入度的点,重复这个过程

topological sorting : out-degree + dfs

  • image-20200927213538190
  • 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无意义

bcc例子

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iv9bB6tz-1601600407793)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20200927222054308.png)]
  • hdc就是一个bcc
  • 更为完整的是包含f的
  • 发现f并不在c的下面

你可能感兴趣的:(数据结构,dfs,bfs)