我目前正在使用Graph,但它缺少一种方法来创建由给定的顶点列表引起的原始图的子图。
我已经编写了一个使用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
行为未记录,但是图的源显示它会复制属性,但不会复制顶点/边。
CPAN上已有功能请求:https://rt.cpan.org/Ticket/Display.html?id=65497
那么,是否有其他模块(可能是XS),或者我应该修补Graph
,还是每个人自己编写图表类,我也应该这样做?
答案 0 :(得分:2)
所以我把这个问题的代码发布到了github(有10个单元测试)。
https://github.com/dallaylaen/perl-Graph-Subgraph
我很欣赏批评,错误报告和更多测试用例。希望有一天它能进入主模块。
更新:现在可以通过CPAN:Graph::Subgraph获得。但上段仍然有效。
答案 1 :(得分:0)
如果你有一个所有顶点列表和你想要的顶点列表,那么计算两者之间的集合差异并使用
$graph->delete_vertices(@unwanted_vertices);
我之前使用过这样的东西来修剪一个大图。