深度优先搜索

深度优先搜索是一种图遍历算法,用于探索最近发现节点的所有边,直至所有节点都被发现。它与广度优先搜索不同,后者常用于找最短路径。深度优先搜索形成多棵深度优先树,形成前驱子图,每个节点有两个时间戳记录发现和扫描时间。算法时间复杂度为Θ(V+E),并能对边进行树边、后向边、前向边和横向边的分类。括号化定理、白色路径定理等描述了其性质。
摘要由CSDN通过智能技术生成

编辑于 2020年10月2日20点45分  关于后向边和前向边的一些概念问题的补充说明

 

深度优先搜索:总是对最近才发现的节点v的出发边进行探索,直到该节点的所有出发边都被发现为止。一旦某个节点v的出发边都被发现,搜索则回溯到v的前驱节点。

如果还存在尚未发现的节点,则深度优先搜索将这些未被发现的节点中任选一个作为新的源节点。并重复该过程,直到所有节点都被发现。

注意:可以看到,在此处的限定条件是直到所有的节点都被发现为止,这也是深度优先搜索与广度优先搜索不同的地方,由于广度优先搜索常常用来寻找从特定源节点出发的最短路径,而深度优先算法则常常作为另一个算法中的子程序。

正由于深度优先搜索的这个性质,其形成的前驱子图也与广度优先搜索形成的不同,因为前者可以通过源节点形成多棵树。

前驱子图(In DFS):对于图G =(V, Ep),其中Ep = {(v.p,  v): v∈V且v.p≠NIL}。深度优先搜索的前驱子图形成一个由多棵深度优先树构成的深度优先森林,森林Ep的边仍然被称为树边。

时间戳:DFS对于每个节点v来说,都有两个时间戳:第一个v.d记录节点v第一次被发现的时间,第二个v.f则记录完成对v的邻接链表完成扫描的时间。

显然,对于同一个节点的d和f来说,有: u.d<u.f。

以下是伪代码实现,其中time是实现时间戳的一个全局变量。我们应当关心的是其应该在什么时间增加:

在代码中,有两个增加的时间:

1、每当扫描到一个白色的节点的时候,增加1,并将该白色节点的u.d赋为增加后的time。

2、没当对某个节点的邻接链表进行充分的扫描后,增加1,并将该灰色节点的u.f赋为增加后的time。

  DFS(G)
  {
     for each vertex u ∈ G.V
         u.color = WHITE;
         u.p = NIL;
     time = 0;
     for each vertex u ∈ G.V
         if(u.color = WHITE) //在这个函数中找到的color = WHITE 的节点为每一次搜索的源节点
            DFS-VISIT(G, u);

    }


    DFS-VISIT(G, u)  // 这是一个递归函数
    {
    time = time + 1;
    u.d = time;
    u. color = GRAY;
    for each v∈G:Adj[v]         
    //在对某个节点进行深度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值