今天早上我偶然发现了Perl's Graph library。我曾经编写了一个快速程序来查找有向图中的所有(弱)连接组件。这是程序。
use strict;
use Graph;
use Data::Dumper;
my $g = Graph->new();
foreach my $file(@ARGV)
{
open(my $IN, "<", $file) or die("cannot open '$file'");
while(my $line = <$IN>)
{
chomp($line);
my($source, $target, $edge_label) = split(/\t/, $line);
$g->add_edge($source, $target);
}
close($IN);
}
my @clusters = $g->weakly_connected_components();
print Dumper(\@clusters);
...输入数据文件如下所示。
n1 n2 some_data_encoded_in_a_label
n1 n3 some_data_encoded_in_a_label
n4 n5 some_data_encoded_in_a_label
...
...其中第一列是源节点标签,第二列是目标节点标签,第三列是边缘标签。我有几个数据文件,每个文件都有数万个边缘。
这个快速肮脏的脚本完成了工作,但有一些事情本来很不错。
是否有任何替代图表库包含这些功能中的一个或两个?实现的语言不是很重要 - 我对C / C ++,Python,Perl,R等开放。
答案 0 :(得分:2)
更改
$g->add_edge($source, $target);
to(每个边缘零个或一个标签)
$g->add_edge($source, $target);
$labels{$source}{$target} = $edge_label;
或(每条边的任意数量的标签)
$g->add_edge($source, $target);
push @{ $labels{$source}{$target} }, $edge_label;
只需在需要时查找标签。
(对于无向图,添加两个标签两次,一次为source-&gt; target,一次为target-&gt; source。)