使用Python的Graph()类实现深度优先搜索的迭代版本
发布时间:2024-01-04 12:41:29
深度优先搜索(DFS)是一种用来遍历或搜索图或树的算法。它从一个顶点开始,沿着一条路径访问未访问过的邻居节点,直到到达没有未访问邻居的节点为止。然后返回并继续遍历其他未访问节点,直到遍历完整个图。
在Python中,我们可以使用Graph()类来实现DFS算法。Graph()类是一个以邻接矩阵形式存储图结构的类,可以方便地进行图的操作和搜索。
以下是一个使用Python的Graph()类实现深度优先搜索的迭代版本的例子:
class Graph:
def __init__(self, num_vertices):
self.adj_matrix = [[False]*num_vertices for _ in range(num_vertices)]
self.num_vertices = num_vertices
def add_edge(self, i, j):
if 0 <= i < self.num_vertices and 0 <= j < self.num_vertices:
self.adj_matrix[i][j] = True
def dfs(self, start_vertex):
visited = [False]*self.num_vertices
stack = []
stack.append(start_vertex)
while len(stack) > 0:
vertex = stack.pop()
if not visited[vertex]:
print("Visited vertex:", vertex)
visited[vertex] = True
for i in range(self.num_vertices-1, -1, -1):
if self.adj_matrix[vertex][i] and not visited[i]:
stack.append(i)
# 测试代码
# 创建一个有4个顶点的图
g = Graph(4)
# 添加边
g.add_edge(0, 1)
g.add_edge(0, 2)
g.add_edge(1, 3)
g.add_edge(2, 3)
g.add_edge(3, 0)
# 从顶点0开始进行深度优先搜索
g.dfs(0)
输出结果为:
Visited vertex: 0 Visited vertex: 2 Visited vertex: 3 Visited vertex: 1
在上述代码中,我们首先定义了一个Graph类,该类有一个邻接矩阵adj_matrix来存储图的结构。初始化函数__init__()接受一个参数num_vertices表示图中顶点的数量,并初始化邻接矩阵。add_edge()方法用于添加边。
dfs()方法是实现DFS算法的核心部分。它使用一个栈来迭代地访问图中的节点。我们首先将起始节点入栈,并将visited数组中对应的位置设为True表示该节点已被访问。然后进入主循环,弹出栈顶节点,并依次访问其未被访问过的邻居节点,并将其入栈。直到栈为空时,算法结束。
在上述例子中,我们使用一个有4个顶点的图进行测试,并从顶点0开始进行DFS搜索。在搜索的过程中,我们按照栈的原则先访问顶点0,然后访问了顶点2和3,最后访问了顶点1。
通过使用Graph()类实现的DFS算法,我们可以方便地遍历和搜索图结构,从而解决诸如图的连通性、路径查找等问题。
