XP is just a number PerlMonks

### Re^4: Finding All Paths From a Graph From a Given Source and End Node

by choroba (Archbishop)
 on Oct 29, 2010 at 00:15 UTC ( #868186=note: print w/replies, xml ) Need Help??

Using your graph and R=>P as the path, the short circuit is the best:
```           Rate   breadth    limbic     depth limbic_sc
breadth   158/s        --      -34%      -42%      -60%
limbic    238/s       51%        --      -13%      -39%
depth     274/s       73%       15%        --      -30%
limbic_sc 392/s      148%       65%       43%        --
• Comment on Re^4: Finding All Paths From a Graph From a Given Source and End Node

Replies are listed 'Best First'.
Re^5: Finding All Paths From a Graph From a Given Source and End Node
by Limbic~Region (Chancellor) on Oct 29, 2010 at 01:04 UTC
choroba,
As I indicated before, certain graphs, order of traversal and endpoints will determine how well the short circuiting approach fairs. I have asked for advice concerning this at Short Circuiting DFS Graph Traversal. My fastest normal solution is below.

Cheers - L~R

Dear Limbic,
I tried the following graph and predertimined start and position in code below. But why It gives empty result? Please refer to the visualization of the graph here (http://graph.gafol.net/cESwUMeNd) .
```
my %graph2 = (
],
],
]
);

sub find_paths {
my (\$beg, \$end, \$graph) = @_;

my \$n;
my %node_to_int = map {\$_ => \$n++} keys %graph;

my (@work, @solution);
for (@{\$graph->{\$beg}}) {
if (\$_ eq \$end) {
push @solution, "\$beg->\$end";
next;
}
my \$seen = '';
vec(\$seen, \$node_to_int{\$_}, 1) = 1;

vec(\$seen, \$node_to_int{\$beg}, 1) = 1;

push @work, ["\$beg->\$_", \$_, \$seen];
}
while (@work) {
my \$item = pop @work;
my (\$path, \$curr, \$seen) = @\$item;
for my \$node (@{\$graph->{\$curr}}) {
my \$bit = \$node_to_int{\$node};
next if vec(\$seen, \$bit, 1);
if (\$node eq \$end) {
push @solution, "\$path \$end";
next;
}
my \$new_seen = \$seen;
vec(\$new_seen, \$bit, 1) = 1;
push @work, ["\$path->\$node", \$node, \$new_seen];
}
}

# Return
print Dumper \@solution;
return \@solution;
}

---
neversaint and everlastingly indebted.......
neversaint,
The problem was that the %node_to_int lookup assumed all possible nodes would also be keys in graph. One way to fix it would be to have nodes that don't connect anywhere as node => [] (empty array ref). I chose to provide a solution below that doesn't require the user to type more than is necessary when building the graph.

Cheers - L~R

Create A New User
Node Status?
node history
Node Type: note [id://868186]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (5)
As of 2020-04-04 00:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
The most amusing oxymoron is:

Results (32 votes). Check out past polls.

Notices?