尝试运行它时深度优先搜索当前的实现问题

时间:2019-01-06 23:12:44

标签: python-3.x search graph dfs undirected-graph

我在这里尝试共享我的深度优先搜索(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 :)。感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您要

vertices = graph.keys()
edges = graph.values()

'Graph'是一个字典对象。 graph [0]表示“找到我与键= 0相关的值”。由于您没有key = 0,因此会出现错误。

您可能会使字典与列表混淆。 my_list [0]说给我my_list中位置0的值。

答案 1 :(得分:0)

我已经发现我的问题了。 @blueenvelope对字典的想法是正确的,因为没有使用关键字,因此由于某种原因给了我0。最后,它最终从未连接的顶点读取了整个图列表。

我的变量verticesedges的实现不正确,很快就了解了它的用途。 用于查找特定的字典,因此我要从图形顶点中提取键。同样适用于我的边缘,但也可以从特定键中提取这些边缘的。这是完整的固定代码:

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)