微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用字典进行深度优先搜索?

如何解决使用字典进行深度优先搜索?

我正在尝试使用字典进行深度优先搜索,其中键是将要访问的下一个节点,值是前任节点,但有些地方不太正确。到目前为止,我有

from collections import deque
class Graph:

    def __init__(self,n):
        self.adj = {}
        for i in range(n):
            self.adj[i] = []

    def are_connected(self,node1,node2):
        return node2 in self.adj[node1]

    def adjacent_nodes(self,node):
        return self.adj[node]

    def add_node(self):
        self.adj[len(self.adj)] = []

    def add_edge(self,node2):
        if node1 not in self.adj[node2]:
            self.adj[node1].append(node2)
            self.adj[node2].append(node1)

    def number_of_nodes():
        return len()

def DFS(G,node1):
    S = [node1]
    marked = {}
    pred = {}
    for node in G.adj:
        marked[node] = False
    while len(S) != 0:
        current_node = S.pop()
        if not marked[current_node]:
            marked[current_node] = True
            for node in G.adj[current_node]:
                # if node == node2:
                #     return True
                S.append(node)
        if not marked[node]:
            pred[node] = current_node
    pred[current_node] = node
    return pred 

当我打电话时:

G = Graph(20)
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,4)
G.add_edge(0,1)
G.add_edge(4,5)
G.add_edge(5,6)
G.add_edge(6,7)
G.add_edge(4,6)
G.add_edge(2,6)
G.add_edge(8,9)
G.add_edge(10,3)
G.add_edge(2,3)

print(DFS(G,1))

我得到 {0: 1,6: 2,10: 3,1: 6} 但这不可能是正确的,因为 G 中有许多节点甚至没有被访问过,而且我不太清楚问题是什么。任何帮助表示赞赏!

解决方法

您将 if not marked[node] 条件放在错误的位置。

def DFS(G,node1):
    S = [node1]
    marked = {}
    pred = {}
    for node in G.adj:
        marked[node] = False
    while len(S) != 0:
        current_node = S.pop()
        if not marked[current_node]:
            marked[current_node] = True
            for node in G.adj[current_node]:
                # if node == node2:
                #     return True
                S.append(node)
                if not marked[node]:
                    pred[node] = current_node
    pred[current_node] = node
    return pred 

输出将是:{2: 1,0: 1,3: 4,6: 2,5: 4,7: 6,4: 6,10: 3,1: 6}

这是您期望的吗?

,

1:您想从 DFS 函数返回的字典无法显示。假设我们有两条到节点 1 的路径,分别是节点 0 和节点 2,如果我们得到 {1:2},那么 {1:0} 将替换 {1:2},你可能会丢失一些节点路径。>

2:要进行深度优先搜索,我们需要“走到最后”。函数中的数组 S 进行循环,但首先使广度。

我使用递归函数来修改你的代码:

def DFS(G,node1,marked = []):
    S = [node1]
    pred = []
    while len(S) != 0:
        current_node = S.pop()
        if current_node not in marked:
            marked.append(current_node)
            pred.append(current_node)
            for node in G.adj[current_node]:
                # if node == node2:
                #     return True
                pred.extend(DFS(G,node,marked))
    return pred

我运行了你的测试用例。这是打印结果: [1,2,3,4,5,6,7,10,0]

希望答案可以帮到你哦。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。