我在这里尝试共享我的深度优先搜索(DFS)实现。我正在尝试学习如何在无向图中遍历,这意味着并非所有节点都在一个图中,而是在两个不同的图中。我一直在寻找仅具有一张图的DFS的基础知识。然后我遇到了一个问题:“如果有多个图并且没有连接,会发生什么?”。因此,我开始使用简单DFS中的知识来研究如何做到这一点。实施。但是,它比我想象的要复杂一些。这是我遇到的代码示例:
"""DFS implemention."""
adjacency_matrix = {
1: [2, 3],
2: [4, 5],
3: [5],
4: [6],
5: [6],
6: [7],
7: [],
8: [9],
9: [8]
}
def DFS_un(graph):
"""Traversal for undirected graphs."""
vertices = graph[0]
edges = graph[1]
def visit(vertex):
if vertex in visited:
return
visited.add(vertex)
print(vertex)
if vertex in edges:
for e in edges[vertex]:
visit(e)
visited = {}
for v in vertices:
visit(v)
if __name__ == '__main__':
DFS_un(adjacency_matrix)
错误消息说明:
Traceback (most recent call last):
File "dfs.py", line 33, in <module>
DFS_dis(adjacency_matrix)
File "dfs.py", line 17, in DFS_dis
vertices = graph[0]
KeyError: 0
如果看到的话,我正在使用一个图形,但是它有无向数字,分别是8和9(8 <-> 9)。为什么我的输出不正确?抱歉,也学习了一些Python3 :)。感谢您的帮助!
答案 0 :(得分:1)
您要
vertices = graph.keys()
edges = graph.values()
'Graph'是一个字典对象。 graph [0]表示“找到我与键= 0相关的值”。由于您没有key = 0,因此会出现错误。
您可能会使字典与列表混淆。 my_list [0]说给我my_list中位置0的值。
答案 1 :(得分:0)
我已经发现我的问题了。 @blueenvelope对字典的想法是正确的,因为没有使用关键字,因此由于某种原因给了我0。最后,它最终从未连接的顶点读取了整个图列表。
我的变量vertices
和edges
的实现不正确,很快就了解了它的用途。 键用于查找特定的字典,因此我要从图形顶点中提取键。同样适用于我的边缘,但也可以从特定键中提取这些边缘的值。这是完整的固定代码:
adjacency_matrix = {
1: [2, 3],
2: [4, 5],
3: [5],
4: [6],
5: [6],
6: [7],
7: [],
8: [9],
9: [8]
}
def DFS_un(graph):
"""Traversal for undirected graphs."""
vertices = graph.keys()
edges = graph.values()
visited = []
def visit(vertex):
if vertex in visited:
return
print("Visited vertex: ")
visited.append(vertex)
print(visited)
print("Current vertex: ")
print(vertex)
print("\n")
if vertex in edges:
for e in edges[vertex]:
visit(e)
for v in vertices:
visit(v)
if __name__ == '__main__':
DFS_un(adjacency_matrix)