有向图中的循环
Posted
技术标签:
【中文标题】有向图中的循环【英文标题】: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
【问题讨论】:
【参考方案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
【讨论】:
以上是关于有向图中的循环的主要内容,如果未能解决你的问题,请参考以下文章