【发布时间】:2015-12-25 15:50:53
【问题描述】:
我正在寻找 Perl 脚本可以检测有向图中的所有循环节点的问题的解决方案? 例如,我有以下图表:
A<-N<-G<-L<- A<-B<-C<-D<-E<-F<-A Be a Graph with cyclic edges.
use strict;
use warnings;
my @graphNodes=(A,N,G,L, A,B,C,D,E,F,A );
my depEdges= dependBy(); #Let dependBy be hypothetical function that return immediate dependents.
在其余代码中,我需要逻辑帮助来收集所有涉及循环依赖的节点。例如,在我的例子中,在节点“A”上,存在循环依赖。如何递归实现dependBy函数来查找循环边或依赖项?
【问题讨论】:
-
您的问题到底是什么?您希望我们为您写这篇文章吗?
-
@simbabque 不是。我已经提到了。我想在有向图中找到对节点的循环依赖。只是需要合乎逻辑的帮助。
-
不确定依赖边是什么意思。圆圈中的所有节点都是“依赖”的吗?你想找到图中每个有向圆中的节点吗?因此,在您的示例图中,您将输出 2 个圆圈中涉及的 2 组节点?
-
在任何情况下,通常,您都必须执行递归深度优先搜索之类的操作,跟踪(/作为参数发送)所见节点。当你点击一个你以前见过的节点时,你可以记录循环并返回它。当您递归一个步骤时,您保存返回的结果并尝试不同的路径(/child)并查看它是否产生另一个循环。当您回到起始节点并且没有其他路径可以尝试时,它就会结束。不确定从哪里开始的最佳位置,但您可以全局跟踪任何未触及的节点,并在外循环中循环遍历这些节点。
-
@hepcat72 感谢您的指导。对于您的问题,所有节点都直接间接依赖于“A”或其他节点。并且,它们回到 A 形成一个循环,但是,在我的情况下,dependby 函数只会产生 BL 作为其依赖节点。同时,dependy 的进一步递归将产生 B 和 L 的相应相邻或直接边。我应该如何继续实施一个逻辑,其中“dependby”函数列出所有节点并查找循环中涉及的节点。
标签: perl graph cyclic-dependency