While
Graph can certainly do this for you, understanding the graph theory involved is a good idea. Basically, here's what you do:
- For each available vertex:
- Select it ($seen{$vertex} = 1)
- Push the vertex to the current path (push @path, $vertex)
- If the number of vertices in the path equals the desired length (@path == $len)
- Store the path in the master list (push @all_paths, [@path])
- Else:
- Set "available vertices" to all unseen adjacent vertices (grep { !$seen{$_} } @{ $adjacent{$vertex} })
- Repeat from top
- Remove the latest vertex added to the path (pop @path)
- Un-select the vertex ($seen{$vertex} = 0)
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!).
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.