2012-11-06 81 views
1

今天早上我偶然發現了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等

回答

2

變化

$g->add_edge($source, $target); 

至(每邊零個或一個標籤)

$g->add_edge($source, $target); 
$labels{$source}{$target} = $edge_label; 

或(任何數量的每條邊的標籤)

$g->add_edge($source, $target); 
push @{ $labels{$source}{$target} }, $edge_label; 

而就查找當你需要它的標籤。

(對於無向圖,加上每個標籤兩次,一次用於源 - >目標和一次靶>源。)

+0

+1是的,我想這是第二個問題一個體面的解決辦法。如果有一種方法不僅可以獲得節點,而且還可以獲得每個連接組件的邊緣,我真的很感興趣。 –

+0

另外,由於這是一個有向圖,因此您只需要添加標籤一次。 A→B的邊緣與B→A的邊緣不同,並且會有不同的標籤。 –