in reply to find all paths of length n in a graph

While Graph can certainly do this for you, understanding the graph theory involved is a good idea. Basically, here's what you do: This is a relatively simple recursive process. The code is basically something like:
my $paths_ref = get_paths(\%adjaceny_matrix, $length); sub get_paths { my ($adj, $len) = @_; my @paths; _get_paths_helper(\@paths, $adj, $len, [], {}, [keys %$adj]); return \@paths; } sub _get_paths_helper { my ($p, $am, $len, $curr, $seen, $avail) = @_; for my $v (@$avail) { push @$curr, $v; local $seen->{$v} = 1; if (@$curr == $len) { push @$p, [@$curr] } else { _get_paths_helper($p, $am, $len, $curr, $seen, [grep { !$seen->{ +$_} } @{ $am->{$v} }]); } pop @$curr; } }
This can be modified to allow you to search for multiple depths without having to call the main function multiple times (which would be terribly inefficient!).

Jeff japhy Pinyan, P.L., P.M., P.O.D, X.S.: Perl, regex, and perl hacker
How can we ever be the sold short or the cheated, we who for every service have long ago been overpaid? ~~ Meister Eckhart

Replies are listed 'Best First'.
Re^2: find all paths of length n in a graph
by Roy Johnson (Monsignor) on Jan 10, 2006 at 20:47 UTC
    Algorithm::Loops' NestedLoops allows a non-recursive implementation:
    use Algorithm::Loops 'NestedLoops'; sub find_path { my ($adj_list, $length) = @_; my %been_there; NestedLoops([ [sort {$a <=> $b} keys %$adj_list], (sub { # The last value on @_ has just changed, so remove it from %be +en_there # and set the new one my ($last_position, $last_value) = ($#_, $_[-1]); delete $been_there{$_} for grep $been_there{$_} >= $last_posit +ion, keys %been_there; $been_there{$last_value} = $last_position; # Here I grep out the already-visited nodes, but you could als +o exclude # any letters that don't result in prefixes of real words. [ grep !defined($been_there{$_}), @{$adj_list->{$last_value}} +] }) x ($length-1)] ); } my $i = find_path(\%adjacency_list, 3); my @path; print "@path\n" while @path = $i->();

    Caution: Contents may have been coded under pressure.