2012-01-04 2 views
1

В настоящее время я использую Graph, однако в нем отсутствует метод создания подграфа исходного графа, вызванного заданным списком вершин.Создание подграфа графа, вызванного списком узлов

Я написал окурок, который делает это с помощью аксессоров графа, но

Вот мой код:

# subgraph ($graph, @node_list); 
# return subgraph (with the same setup) 
# induced by node list 
sub subgraph { 
    my $self = shift; 
    my $new = $self->new; 
    my @edges; 
    foreach my $v(@_) { 
     $self->has_vertex($v) or next; 
     $new->add_vertex($v); 
     foreach my $u(@_) { 
      $self->has_edge($u, $v) and push @edges, $u, $v; 
     }; 
    }; 
    $new->add_edges(@edges); 
    return $new; 
}; 

Примечание:

  • $Graph->new поведение документированы, однако, как источник Graph показывает, что он скопирует атрибуты, но не вершины/ребра.

  • Там уже запрос функции на CPAN: https://rt.cpan.org/Ticket/Display.html?id=65497

Итак, есть ли какой-либо другой модуль (возможно, XS), или я должен исправить Graph, или каждый пишет себе класс графа, и я должен делать это тоже?

ответ

2

Итак, я отправил код из вопроса в github (с примерно 10 модульными тестами).

https://github.com/dallaylaen/perl-Graph-Subgraph

Я был бы признателен за критику, сообщения об ошибках и больше тестов. Надеюсь, что однажды он попадает в основной модуль.

ОБНОВЛЕНИЕ: Теперь доступно через CPAN: Graph::Subgraph. Тем не менее вышеприведенный параграф все еще имеет место.

0

Если у вас есть список всех вершин и список вершин, которые вы хотите, а затем вычислить разность множеств, между ними и использовать

$graph->delete_vertices(@unwanted_vertices); 

Я использовал somethiing, как это ранее подрезать вниз большой граф.

+0

Хм, это должно быть лучшим решением, когда '$ graph-> edge' <<' $ subgraph-> nodes ** 2'. Тем не менее, я все же предпочел бы скопировать исходный граф и не испортить его. – Dallaylaen

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