#!/usr/bin/perl -w
use strict;
use Data::Dumper;
@ARGV = 'roads.dat';
my (@lines,@edge,%verts);
while(<>){
chomp;
push @lines, [split ",", $_];
}
map push(@edge, load(@{$_})), @lines;
foreach my $edge(@edge){
my($from,$to)=($verts{$edge->{From}},$verts{$edge->{To}});
push @{$from->{Edges}}, $edge;
push @{$to->{Edges}}, $edge;
print map "$_->{Cost} " , @{$verts{"East Jordan"}->{Edges}};
#print ${$edge}{To};
${$to}{Cost}=${$from}{Cost}=99999999;
}
push my @queue, $verts{"East Jordan"};
${$verts{"Ellsworth"}}{Cost}=0;
while(@queue ne 0){
my $town = shift @queue;
my $cost = $town->{Cost};
print " | ";
print map "$_->{Cost} ", @{$verts{$town}->{Edges}};
foreach(@{$verts{$town}->{Edges}}){
print"[runs]";
my $other = $verts{opposite($_,$town)};
if($cost+$_->{Cost} < $other->{Cost}){
$other->{Cost}=$cost+$_->{Cost};
$other->{Last}=$_;
push @queue, $other;
}
}
}
print map "$_->{Name} $_->{Cost} $_->{From} $_->{To}\n", @edge;
print Dumper(\%verts,\@edge);
sub opposite{
if($verts{${$_[0]}{From}} eq $_[1]){
$_[0]->{To};
} elsif ($verts{$_[0]->{To}} eq $_[1]){
$_[0]->{From};
} else {
die "opposite failed, ",$!;
}
}
sub load{
{Name => $_[0],
Cost => $_[1],
From => "$_[2]",
To => "$_[3]",};
}
####
A,5,Ellsworth,East Jordan
C,12,Ellsworth,Bellaire
B,30,Bellaire,East Jordan
D,19,East Jordan,Charleviox
E,45,Ellsworth,Elk Rapids
F,22,East Jordan,Elk Rapids
G,2,East Jordan,Atwood
H,14,Atwood,Charleviox
####
$VAR1 = {
'HASH(0x9f646ec)' => {
'Edges' => []
},
'Ellsworth' => {
'Cost' => 0
},
'East Jordan' => {
'Cost' => 99999999,
'Edges' => [
{
'To' => 'East Jordan',
'Cost' => '30',
'Name' => 'B',
'From' => 'Bellaire'
},
{
'To' => 'Charleviox',
'Cost' => '19',
'Name' => 'D',
'From' => 'East Jordan'
},
{
'To' => 'Elk Rapids',
'Cost' => '22',
'Name' => 'F',
'From' => 'East Jordan'
},
{
'To' => 'Atwood',
'Cost' => '2',
'Name' => 'G',
'From' => 'East Jordan'
}
]
}
};
$VAR2 = [
{
'To' => 'East Jordan',
'Cost' => '5',
'Name' => 'A',
'From' => 'Ellsworth'
},
{
'To' => 'Bellaire',
'Cost' => '12',
'Name' => 'C',
'From' => 'Ellsworth'
},
$VAR1->{'East Jordan'}{'Edges'}[0],
$VAR1->{'East Jordan'}{'Edges'}[1],
{
'To' => 'Elk Rapids',
'Cost' => '45',
'Name' => 'E',
'From' => 'Ellsworth'
},
$VAR1->{'East Jordan'}{'Edges'}[2],
$VAR1->{'East Jordan'}{'Edges'}[3],
{
'To' => 'Charleviox',
'Cost' => '14',
'Name' => 'H',
'From'
}
];