有向图循环

时间:2018-10-23 22:41:12

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

我正在接线一个函数,以检查图形是否包含循环。

它表示为每个节点连接到的节点的所有索引的列表的列表。节点从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 :(得分: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