HI perl monks, I have undirected graph with 57 nodes and 204 linkages. I calculate the shortest path of all nodes with its sub nodes using Dijkstram algorithm, but I couldn't able to print the path of the nodes from a given root. here is how i tried.
########## 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";
}
}
the problem occurs on the while loop. when it gets a node that doesn't have the same root and when the previous node always returns the same node. please help me or give me any suggestion.
thanks
|