📜  图的深度优先搜索或 DFS(1)

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

图的深度优先搜索或 DFS

在图的遍历中,深度优先搜索(DFS)是一种常见的方法。它能够遍历整个图,并且可以找到任意两个点之间的路径。在实现 DFS 时,我们需要使用递归或栈这两种数据结构。

实现 DFS

以下是一个基本的图数据结构的代码表示,我们将使用它来演示 DFS 的实现。

class Graph:
    def __init__(self):
        self.vertices = dict()

    def add_vertex(self, vertex):
        self.vertices[vertex] = []

    def add_edge(self, v1, v2):
        self.vertices[v1].append(v2)
        self.vertices[v2].append(v1)

接下来,我们将从一个顶点开始遍历整个图。为了在遍历图的过程中不重复访问顶点,我们需要一个集合 visited 来记录哪些顶点已经被访问过。

我们将从第一个顶点开始遍历,然后通过递归或栈,进一步遍历此图。

def dfs(graph, start, visited=None):
    if visited is None:
        visited = set()

    visited.add(start)

    print(start)

    for neighbor in graph.vertices[start]:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)

这个函数 dfs 首先将起始顶点 start 加入到 visited 集合中,然后打印该顶点的值。接下来,它遍历该顶点的邻居,并且如果这个邻居没有被访问过,那么继续递归调用 dfs 函数。

调用代码

以下是我们如何使用上面定义的 Graph 类和 dfs 函数来创建和遍历一个图的例子。

g = Graph()
g.add_vertex('a')
g.add_vertex('b')
g.add_vertex('c')
g.add_vertex('d')

g.add_edge('a', 'b')
g.add_edge('a', 'c')
g.add_edge('b', 'd')
g.add_edge('c', 'd')

dfs(g, 'a')

以上代码将遍历以下图形:

a -- b
|    |
|    |
c -- d

遍历顺序是 a -> b -> d -> c

结论

根据 DFS 的定义,它会访问整张图的所有节点,因此,DFS 是一种非常有用的算法。在图的遍历中,它是一种非常常见的技术。

我们可以在 DFS 函数中添加更多的参数和逻辑,以扩展函数的功能。这里只是一个基本的实现,但是它足以让你理解如何使用 DFS 遍历图。