C++ dfs 有关图的知识(四十四)【第五篇】

今天是dfs有关图的知识,关于图我们之前讲了好多好多期。今天我我们呢来看dfs图的遍历

1.图和搜索

深度优先搜索不仅可以在迷宫上进行,也可以在图上进行,或者对于任何的深度优先搜索,我们都可以把深度优先搜索的图画出来。

如果我们研究深度优先搜索的过程,把每一个经过的状态都画成一个点,把从这个状态去另一个状态这个递归的调用看成一条从这个状态到那个状态的边,就会画出一张图。

比如最简单的迷宫问题,状态就是目前所在的位置,那就可以画一个图,点就是每个位置,从这个位置可能可以往周围四个方向走,走到另一个位置,也就是到达另一种状态,如果可以从一个状态走到另一个状态,就给这两个点连上边。

这样就画出了一个图,执行搜索的时候也就是在这个图上走,回溯的时候就是退回上一个点。

图片

如果我们不考虑那么多,就给一个图,那自然也可以在图上搜索。

比如下图是一个无向图,如果我们从 A 点开始深度优先搜索(以下的访问次序并不是唯一的,第二个点既可以是 B 也可以是 C、D),则我们可能得到如下的一个访问过程:
A -> B -> E,回溯到 A,继续访问  -> F -> H -> 
G -> 
D,回溯到 
A,A 此时已经没有未访问的相邻顶点,本次搜索结束。最终通过 A -> B -> E -> 
C -> 
F -> H -> G -> D 的顺序搜索了图中的所有顶点。

图片

那这样的搜索,状态是什么,其实就是当前所在的顶点,我们现在在这个顶点,然后看它连着的所有点,如果某一个点没访问过,就去访问。

在有向图上也是可以进行 DFS 搜索的,也是去看当前点连着的所有点就可以了(有向图的邻接矩阵或邻接表中存的本来就是有向边)。

深度优先搜索也可以借助栈来理解。实际上,当访问一个状态的时候,相当于把这个状态入栈。而从一个状态回溯的时候,相当于弹出栈顶元素。栈顶元素总是当前所在的状态。后面的演示课我们将会更直观地看到这一点。

在连通图上遍历,我们总能得到一个访问的顺序,如果我们使用 DFS 进行搜索,得到的顺序就叫做 DFS 序,从刚才的图也可以看出来一个图的 DFS 序是不唯一的,而且根据一个 DFS 序也没法还原出整张图的样子。不过 DFS 序还是有很大的应用价值的,在以后的学习中我们会见到 DFS 序的应用。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值