是否有可能(快速)在 networkx 图中仅找到第一个循环?

Is it possible to (quickly) find only the first cycle in a networkx graph?

我有一个定向网络,其中可能有也可能没有循环。我需要找到它们并消除循环性。如果我有一个 networkx DiGraph (G),我可以找到所有带有

的循环
cycle_nodes = nx.simple_cycles(G)

这会创建一个循环-returning 生成器。

但是,我不想 return 所有循环都像 list(cycle_nodes) 一样,因为许多循环都是彼此的子集,修复一个就会修复其他的。相反,我只想找到一个循环的第一个实例。由于 cycle_nodes 是一个生成器,我试过

next(cycle_nodes)

到return只是第一个实例。但是,我发现 return 第一个实例所需的时间与 return 所有实例所需的时间相比并没有小多少:

list(cycle_nodes) : 58s
next(cycle_nodes) : 44s

这仅仅是因为我的图表的性质(即第一个循环沿着搜索顺序很远),还是有更有效的方法来 return 任何循环(不一定需要成为第一个)?

我怀疑可能有更快的方法的原因是因为当我 运行 nx.is_directed_acyclic_graph(G) 时,它只需要一两秒钟和 returns False,所以它显然找到了至少在一秒钟左右的时间内完成一个周期。

答案很明显。没有提供起始节点的算法 nx.find_cycle() 将 return 它找到的第一个循环,并且很快。我的印象是需要提供一个起始节点,RTFM!