2015-09-28 69 views
1

我正在寻找Perl脚本可以检测有向图中的所有循环节点的问题的解决方案? 例如,我有如下图:使用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函数来查找循环边或依赖关系?

+1

究竟什么是你的问题?你希望我们为你写这个吗? – simbabque

+0

@simbabque并非如此。我已经提到过。我想在有向图上找到节点上的循环依赖。只需要合理的帮助。 – Analyzer

+0

不确定你的依赖边缘是什么意思。所有节点都在一个圆圈“依赖”?你想在图中出现的每个定向圆中找到节点吗?那么在你的示例图中,你会输出2个圈子中涉及的2组节点吗? – hepcat72

回答

1

虽然这不是概念上的帮助,但它是最快的解决方案:检查是否有人已经找到解决方案。在这种情况下,您可以使用CPAN的Graph模块来执行此操作。

use strict; 
use warnings; 
use feature 'say'; 
use Graph; 

my $g = Graph->new; 

my @edges = qw(A B C D E F A); 
for (my $i =0; $i < $#edges; $i++) { 
    $g->add_edge($edges[$i], $edges[$i+1]); 
} 

say $g; 
say "is cyclic" if $g->is_cyclic; 
say $g->find_a_cycle; 

这将输出:

A-B,B-C,C-D,D-E,E-F,F-A 
is cyclic 
FABCDE 
+0

如果不使用图形模块?在我的情况下,“dependby”函数产生直接相关的边缘。 – Analyzer

+0

@Analyzer你应该可以用Graph来建立它。但对于纯粹的算法帮助,SO恐怕是问这个问题的错误地方。我们帮助解决眼前的问题。因为这不是Perl问题。 – simbabque

+0

感谢您的努力! – Analyzer