########## the dijkstram algorithm################# sub dijkstra { my ($graph, $root) = @_; my (%dist, %prev); foreach $n (keys %{$graph}) { $dist{$n} = inf; $prev{$n}=$n; } # .. except the source $dist{$root} = 0; # loop while we have unsolved nodes # sort unsolved by distance from root foreach my $n1 (sort keys %{$graph}) { foreach my $n2 (keys %{$graph->{$n1}}) { if (($dist{$n2} eq inf)) { $dist{$n2} = $dist{$n1} + $graph->{$n1}{$n2}; $prev{$n2} = $n1; } } } return (\%prev, \%dist); } ######## print the path and the distance for a given node############# sub printPaths { my ($graph, $prev, $dist) = @_; my $path; foreach $n (keys %{$graph}) { my $t = $n; $path = $t; while ($t ne $root) { $t = $prev->{$t}; $path = "$t -> " . $path; } print "$n\t$dist->{$n}\t$path\n"; } }