支持边缘标签的图形库

时间:2012-11-06 19:03:54

标签: c perl graph

今天早上我偶然发现了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
...

...其中第一列是源节点标签,第二列是目标节点标签,第三列是边缘标签。我有几个数据文件,每个文件都有数万个边缘。

这个快速肮脏的脚本完成了工作,但有一些事情本来很不错。

  • weakly_connected_components 方法返回的连接组件只是节点标签数组,因此这些节点之间的连接会丢失。
  • 即使该方法返回一组节点一组边缘,该库也不允许存储与每个边缘相关的标签或数据,这是不方便的。

是否有任何替代图表库包含这些功能中的一个或两个?实现的语言不是很重要 - 我对C / C ++,Python,Perl,R等开放。

1 个答案:

答案 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。)