📅  最后修改于: 2023-12-03 15:23:05.397000             🧑  作者: Mango
在图的遍历中,深度优先搜索(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 遍历图。