有向图中的循环问题

3
我正在编写一个函数来检查图是否包含环。
它被表示为一个列表的列表,其中每个节点连接的所有节点的索引都列出来。节点从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
1个回答

0

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

        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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接