#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use Syntax::Construct qw{ // }; use Graph; my %graph; my $first; # Handle the sample data where there are sometimes less than 4 neighbours. while () { my ($node, @neighbours) = split; $first //= $node; my $distance = 1; for my $neighbour (@neighbours) { if (not exists $graph{$node}{$neighbour} or $graph{$node}{$neighbour} < $distance) { $_ = $distance for $graph{$node}{$neighbour}, $graph{$neighbour}{$node}; } $distance++; } } my $g = 'Graph::Undirected'->new; for my $u (keys %graph) { for my $v (keys %{ $graph{$u} }) { $g->add_weighted_edge($u, $v, $graph{$u}{$v}); } } my $dij = $g->SPT_Dijkstra($first); my %weights = ($first => 0); $weights{$_} //= $dij->get_vertex_attribute($_, 'weight') for keys %graph; say join ' ', sort { $weights{$a} <=> $weights{$b} } keys %weights; __DATA__ O1 O3 O5 O11 O73 O2 O72 O54 O12 O7 O3 O1 O6 O5 O12 O5 O1 O3 O6 O3 O7 O2 O11 O1 O12 O2 O3 O54 O2 O72 O2 O73 O1