2015-09-28 2 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. 

В остальной части коды, мне нужна логическая помощь, чтобы собрать все узлы, которые участвуют в циклических зависимости. Например, в моем случае на узле «А» существуют циклические зависимости. Как я могу рекурсивно реализовать функцию dependBy для поиска циклических ребер или зависимостей?

+1

Что именно ваш вопрос? Вы ожидаете от нас написать это для вас? – simbabque

+0

@simbabque Не совсем. Я уже упоминал. Я хочу найти циклическую зависимость над узлом в ориентированном графе. Просто нужна логическая помощь. – Analyzer

+0

Не знаете, что вы подразумеваете под зависимыми краями. Все ли узлы в круге «зависимы»? Вы хотите найти узлы в каждом направленном круге, которые присутствуют на графике? Таким образом, в вашем примере графика вы будете выводить 2 набора узлов, участвующих в 2 кругах? – hepcat72

ответ

1

Хотя это не концептуальная помощь, это самое быстрое решение: проверьте, нашел ли кто-нибудь решение. В этом случае вы можете использовать модуль Graph от CPAN для этого.

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

Смежные вопросы