【问题标题】:Depth in Directed Graph: Finding nodes at k distance from a given node有向图中的深度:查找距给定节点 k 距离处的节点
【发布时间】:2019-12-07 17:45:44
【问题描述】:

我正在尝试使用函数查找距给定节点 k 距离的节点。

这是我的代码:

def depth(graph, start, k):
    def levels(graph, start, visited, current_nodes, k):
        #base case
        if k == 0:
            return current_nodes
        else:
            current_nodes = []
        #if no neighbors, return
        if graph.adjacent_nodes(start) == []:
            return []
        for nodes in graph.adjacent_nodes(start):
            if nodes not in visited:
                visited.append(nodes)
            current_nodes.append(nodes)
        print("visited =", visited)
        print("current_nodes =", current_nodes)
        print("k =", k)
        for nodes in current_nodes:
            return levels(graph, nodes, visited, current_nodes, k-1)

    visited = [start]
    current_nodes = []
    required_nodes = levels(graph, start, visited, current_nodes, k)
    print(required_nodes)
    return required_nodes

这在 Spyder 中应该是这样工作的,但对于我的在线课程却不是(我刚刚开始学习)。我正在打印visitedcurrent_nodesk 以查看发生了什么。

例如对于a->b->c->dstart = ak = 5,它应该返回一个空列表,这意味着在5a 的距离处没有节点。 Spyder的输出如下:

visited = ['a', 'b']
current_nodes = ['b']
k = 5
visited = ['a', 'b', 'c']
current_nodes = ['c']
k = 4
visited = ['a', 'b', 'c', 'd']
current_nodes = ['d']
k = 3
[]

但是,对于在线课程,输出如下:

visited =  ['A', 'B']
current_nodes =  ['B']
k =  5
visited =  ['A', 'B', 'C']
current_nodes =  ['C']
k =  4
visited =  ['A', 'B', 'C', 'D']
current_nodes =  ['D']
k =  3
[]
visited =  ['A', 'B']
current_nodes =  ['B']
k =  4
visited =  ['A', 'B', 'C']
current_nodes =  ['C']
k =  3
visited =  ['A', 'B', 'C', 'D']
current_nodes =  ['D']
k =  2
[]
visited =  ['A', 'B']
current_nodes =  ['B']
k =  3
visited =  ['A', 'B', 'C']
current_nodes =  ['C']
k =  2
visited =  ['A', 'B', 'C', 'D']
current_nodes =  ['D']
k =  1
['D']
visited =  ['A', 'B']
current_nodes =  ['B']
k =  2
visited =  ['A', 'B', 'C']
current_nodes =  ['C']
k =  1
['C']
visited =  ['A', 'B']
current_nodes =  ['B']
k =  1
['B']
[]
visited =  ['A', 'B', 'D']
current_nodes =  ['B', 'D']
k =  3
visited =  ['A', 'B', 'D', 'C']
current_nodes =  ['C']
k =  2
visited =  ['A', 'B', 'D', 'C']
current_nodes =  ['D']
k =  1
['D']

谁能告诉我我的代码是否有问题?

【问题讨论】:

    标签: python algorithm depth directed-graph


    【解决方案1】:

    问题是current_nodes 不应附加已访问过的节点。并且在检查了相邻节点之后,如果current_nodes为空,则无事可做,所以返回一个空列表(表示在k距离处没有找到节点)。

    def depth(graph, start, k):
        def levels(graph, start, visited, current_nodes, k):
            '''BASE CASE'''
            if k == 0:
                return current_nodes
            else:
                current_nodes = []
            '''IF NO NEIGHBORS, RETURN AN EMPTY LIST'''
            if graph.adjacent_nodes(start) == []:
                return []
            for nodes in graph.adjacent_nodes(start):
                if nodes not in visited:
                    visited.append(nodes)
                    current_nodes.append(nodes)
            print("visited = ", visited)
            print("current_nodes = ", current_nodes)
            print("k = ", k)
            '''IF ALL ADJACENT NODES ALREADY VISITED, CURRENT NODES WILL BE EMPTY, RETURN []'''
            if current_nodes == []:
                return []
            '''RECURSION'''
            for nodes in current_nodes:
                return levels(graph, nodes, visited, current_nodes, k-1)
    
        visited = [start]
        current_nodes = []
        required_nodes = levels(graph, start, visited, current_nodes, k)
        print(required_nodes)
        return required_nodes
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 2021-11-03
      • 2011-10-12
      • 1970-01-01
      相关资源
      最近更新 更多