summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordoy <doy@tozt.net>2008-12-14 17:44:40 -0500
committerdoy <doy@tozt.net>2008-12-14 17:44:40 -0500
commit844fe2c576b1ba53b0fc88c8a2a1c3c1bf868dc9 (patch)
treedbe97d658f69bd6f31b321bc5f08c3ed0c9e267f
parentacbc804d0551bf986e37ab021335aa0cd0fb4608 (diff)
downloadgraph-implicit-844fe2c576b1ba53b0fc88c8a2a1c3c1bf868dc9.tar.gz
graph-implicit-844fe2c576b1ba53b0fc88c8a2a1c3c1bf868dc9.zip
implement bfs and dfs
-rw-r--r--lib/Graph/Implicit.pm26
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 {