【问题标题】:Cycles in directed graph有向图中的循环
【发布时间】:2019-03-28 06:21:49
【问题描述】:

我正在连接一个函数来检查图形是否包含循环。

它表示为每个节点连接到的节点的所有索引列表的列表。节点从 1 开始枚举(任务要求)。

在检查图形[[2, 3], [], [4], []]时,程序正确地进入了第一个列出的节点,但在第二次迭代中,假定adjlist[node-1]是一个值为3的int而不是一个数组(或int = 2至少)

我错过了什么?

代码:

def is_acyclic(adjlist: List, visited: List, path: List) -> bool:
    '''
    :param adjlist: list representation of a graph; eg: [[2, 3], [], [4], []]
    :param visited: visited nodes
    :param path: visited nodes in current iteration
    :return: the graph does not contain a cycle
    '''

    for node in range(1, len(adjlist)+1):
        if node not in visited:
            visited.append(node)
            path.append(node)

            for child in adjlist[node-1]:
                if child in path:
                        return False
                elif child not in visited:
                    if is_acyclic(adjlist[node-1], visited, path) is False:
                        return False

            path.remove(node)
            return True

【问题讨论】:

    标签: python python-3.x graph-theory


    【解决方案1】:

    这是因为函数被递归调用。这部分代码不断修剪图形邻接列表:

            elif child not in visited:
                if is_acyclic(adjlist[node-1], visited, path, level=level + 1) is False:
                    return False
    

    第一次邻接表是:

    [[2, 3], [], [4], []]
    

    adjlist[node-1][2, 3]

    邻接表的第二次是:

    [2, 3]
    

    adjlist[node-1]3

    由于 2 已经被访问,节点实际上被递增到 2。因此,您会看到:

     adjlist[node-1] == adjlist[2-1] == adjlist[1] == 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多