commit c0c408a450466cf4a7037048857bfab8904dfa89
parent 0f054d0ec4d84eee111878db9b43436f76c20e2d
Author: Samir Parikh <noreply@samirparikh.com>
Date: Thu, 30 Dec 2021 21:50:26 +0000
update dijkstra with main while loop
Diffstat:
M | dijkstra.pl | | | 50 | ++++++++++++++++++++++++++++++++++++++++++++++++-- |
1 file changed, 48 insertions(+), 2 deletions(-)
diff --git a/dijkstra.pl b/dijkstra.pl
@@ -17,11 +17,57 @@ my %graph;
$graph{'start'}{'a'} = 6;
$graph{'start'}{'b'} = 2;
-# get all the neighbors of Start:
+# get all the neighbors (keys) of Start:
say join ", " => keys %{$graph{'start'}};
-# get weights of those edges:
+# get weights (values) of those edges:
say join ", " => values %{$graph{'start'}};
# get key-value pairs for neighbors of Start
foreach my $key (sort keys %{$graph{'start'}}) {
say "$key => $graph{'start'}{$key}";
}
+
+# add the rest of the ndoes and their neighbors to the graph
+$graph{'a'}{'fin'} = 1;
+
+$graph{'b'}{'a'} = 3;
+$graph{'b'}{'fin'} = 5;
+
+# define costs table
+my %costs = (
+ a => 6,
+ b => 2,
+ fin => "inf",
+);
+
+# define hash table for the parents
+my %parents = (
+ a => 'start',
+ b => 'start',
+ fin => 'none',
+);
+
+# array to track all of the nodes we have already processed
+my @processed;
+
+my $node = find_lowest_cost_node(\%costs);
+
+while ($node ne 'None') {
+ my $cost = $costs{$node}; # cost of node
+ my @neighbors = keys %{$graph{$node}}; # neighbors of node
+ # go through all neighbors of this node
+ foreach my $neighbor (@neighbors) {
+ # calculate new cost of getting to neighbor via this node
+ my $new_cost = $cost + $graph{$node}{$neighbor};
+ # if it's cheaper to get to this neighbor through this node
+ if ($costs{$neighbor} > $new_cost) {
+ # update new cost for the neighbor
+ $costs{$neighbor} = $new_cost;
+ # the current node becomes the parent of the neighbor
+ $parents{$neighbor} = $node;
+ }
+ }
+ # mark the node as processed
+ push @processed => $node;
+ # find the next node to process
+ $node = find_lowest_cost_node(\%costs);
+}