我正在尝试使用深度优先搜索(DFS)来遍历我的图。我的函数是dfs(cost_matrix, start_point, goals_array)
。我希望将DFS算法到达任何一个目标状态的路径存储在一个列表中。我无法确定在遍历过程中何时应该向列表中添加或移除项目。我知道一旦达到目标状态,我就可以从循环中跳出。我使用的是迭代的DFS堆栈方法。
def DFS_Traversal(cost, start_point, goals):
num = len(cost)
visited = [0] * num
visited[start_point] = 1
stack = []
stack.append(start_point)
l = [] #用于存储最终路径
l.append(start_point)
while(len(stack)):
s = stack.pop()
if(visited[s] == 0):
visited[s] = 1
if s in goals:
break
for i in range (1, num): #遍历矩阵
if (cost[s][i] != -1 || cost[s][i] != 0):
stack.append(i) #向堆栈中添加成员
return l
回答:
稍微修改了一下,以适应问题中的要求,并在找到其中一个目标时中断 – 来自这里:
from collections import defaultdict # 这个类使用邻接表表示法表示有向图
class Graph:
# 构造函数
def __init__(self):
# 默认字典用于存储图
self.graph = defaultdict(list)
# 向图中添加边的函数
def addEdge(self, u, v):
self.graph[u].append(v)
# DFS使用的函数
def DFSUtil(self, v, visited, goals):
# 标记当前节点为已访问并打印
print(" ")
visited[v] = True
for goal in goals:
if v == goal:
print(f"找到 {v} - 完成!")
return
print(v, end = ' ')
# 递归处理与此顶点相邻的所有顶点
for i in self.graph[v]:
if visited[i] == False:
self.DFSUtil(i, visited, goals)
# 执行DFS遍历的函数。它使用递归的DFSUtil()
def DFS(self, v, goals):
# 标记所有顶点为未访问
visited = [False] * (max(self.graph)+1)
# 调用递归辅助函数以打印DFS遍历
self.DFSUtil(v, visited, goals)
# 驱动代码
# 创建图,图如上图所示
g = Graph()
g.addEdge(0, 1)
g.addEdge(0, 2)
g.addEdge(1, 2)
g.addEdge(2, 0)
g.addEdge(2, 3)
g.addEdge(3, 3)
print("以下是从顶点2开始的DFS")
g.DFS(2, [1,4])
输出:
以下是从顶点2开始的DFS
2 0 找到 1 - 完成!