📜  图的 DFS 中的树、后、边和交叉边(1)

📅  最后修改于: 2023-12-03 15:23:05.376000             🧑  作者: Mango

图的 DFS 中的树、后、边和交叉边

深度优先搜索(DFS)是图论中的一个基本算法。类似于树的先序遍历。DFS是利用了栈来实现的。

在DFS中,涉及到四种类型的边,分别是树边、后向边、前向边和跨边。

树边

当我们深度优先遍历一个图时,第一次遍历到一个新的节点时,就将其作为当前节点的子节点,形成一条边,这条边就是树边。树边反映了搜索树的结构。也就是说,借助某个点的树边,我们可以很自然地推导出该点的所有祖先。

后向边

当我们从一个节点走的所有路径都已经搜索完毕,但是又在该节点的某个后代结点发现了一个指向该节点的边,则该边就是一条后向边。

也就是说,如果在DFS搜索过程中,出现了一条起点和终点都在正在被搜索的路径上的边,那么这条边就是一条后向边。

前向边

当我们从一个节点走向一个尚未搜索过的节点,则该边就被称为前向边。

也就是说,如果在DFS搜索过程中,出现了一条起点在正在被搜索的路径上,而终点尚未被搜索过的边,那么这条边就是一条前向边。

跨边

除了以上三种边之外,如果一条边既不是树边,也不是后向边,也不是前向边,则该边被称为跨边。

也就是说,如果在DFS搜索过程中,出现了一条边,不属于前三种边中的任何一种,那么这条边就是一条跨边。

代码实现

通过理论的介绍,我们对DFS中的树、后、边和交叉边有了更深刻的认识。在实际代码中,我们需要注意以上四种边的处理。

接下来我们给出一个简单的DFS代码示例:

def dfs(graph, node, visited):
    # 标记当前节点为已访问
    visited[node] = True
    
    # 遍历当前节点的每一个邻居
    for neighbor in graph[node]:
        if not visited[neighbor]:
            # 从当前节点到邻居结点之间的边为树边
            dfs(graph, neighbor, visited)
        elif visited[neighbor] and neighbor == node:
            # 遇到了一条自环边
            pass
        elif visited[neighbor]:
            # 从当前节点到邻居结点之间的边为后向边
            pass
        elif neighbor in stack and neighbor != parent:
            # 从当前节点到邻居结点之间的边为跨边
            pass
        else:
            # 从当前节点到邻居结点之间的边为前向边
            pass

需要注意的是,上述代码判断前向边、后向边、跨边的方法可能需要针对具体数据进行修改。