diff options
author | doy <doy@tozt.net> | 2008-12-14 17:44:40 -0500 |
---|---|---|
committer | doy <doy@tozt.net> | 2008-12-14 17:44:40 -0500 |
commit | 844fe2c576b1ba53b0fc88c8a2a1c3c1bf868dc9 (patch) | |
tree | dbe97d658f69bd6f31b321bc5f08c3ed0c9e267f | |
parent | acbc804d0551bf986e37ab021335aa0cd0fb4608 (diff) | |
download | graph-implicit-844fe2c576b1ba53b0fc88c8a2a1c3c1bf868dc9.tar.gz graph-implicit-844fe2c576b1ba53b0fc88c8a2a1c3c1bf868dc9.zip |
implement bfs and dfs
-rw-r--r-- | lib/Graph/Implicit.pm | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/Graph/Implicit.pm b/lib/Graph/Implicit.pm index 2fad054..239bf75 100644 --- a/lib/Graph/Implicit.pm +++ b/lib/Graph/Implicit.pm @@ -35,10 +35,36 @@ sub neighbors { # traversal +sub _traversal { + my $self = shift; + my ($start, $code, $insert, $remove) = @_; + my @bag; + my %marked; + $insert->(\@bag, $start); + while (@bag) { + my $vertex = $remove->(\@bag); + if (not exists $marked{$vertex}) { + $code->($vertex); + $marked{$vertex} = 1; + $insert->(\@bag, $_) for $self->neighbors($vertex); + } + } +} + sub bfs { + my $self = shift; + my ($start, $code) = @_; + return $self->_traversal($start, $code, + sub { push @{ $_[0] }, $_[1] }, + sub { shift @{ $_[0] } }); } sub dfs { + my $self = shift; + my ($start, $code) = @_; + return $self->_traversal($start, $code, + sub { push @{ $_[0] }, $_[1] }, + sub { pop @{ $_[0] } }); } sub iddfs { |