清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
use strict; my @path = (); my @lastpath = (); my $count; my $inputfile = "input"; my $max = 1000; #read the file from input sub readfile{ open(FD,"input") or die "not find file $inputfile"; foreach my $line (<FD>){ my @keys = split(";",$line); my @line = (); foreach my $key (@keys){ push(@line, $key); } push(@path, \@line) } } #set every 0 to 1000 except i=j sub getpath{ readfile; $count = $#path + 1; for ( my $i = 0; $i < $count; $i++){ for ( my $j = 0; $j < $count; $j++){ if ( $i != $j && $path[$i][$j] == 0){ $path[$i][$j] = $max; } } } } #get dijkstra sub dijkstra{ getpath; my @shortpath = (); #stopre the shortest path my @visted = (); #mark whether the node had been visted my $startnode = shift; #mark the start node my @vistpath = (); #every shor path for ( my $i = 0; $i < $count; $i++){ $vistpath[$i] = "$startnode --> $i"; } $shortpath[$startnode] = 0; $visted[$startnode] = 0; for ( my $t = 1; $t < $count; $t++){ for ( my $t = 0; $t < $count; $t++ ){ print $path[$startnode][$t]," "; } print "#######\n"; my $next = -1; my $min = 1000; for( my $i = 0; $i < $count; $i++){ if( !defined($visted[$i]) and $path[$startnode][$i] < $min){ $min = $path[$startnode][$i]; $next = $i; } } $shortpath[$next] = $min; $visted[$next] = 0; for ( my $j = 0; $j < $count; $j++){ if ( !defined($visted[$j]) and $path[$startnode][$next] + $path[$next][$j] < $path[$startnode][$j]){ $path[$startnode][$j] = $path[$startnode][$next] +$path[$next][$j]; $vistpath[$j] = " $vistpath[$next] --> $j"; } } } for (my $i =0; $i < $count; $i++){ print "from $startnode to $i' shortpath is $vistpath[$i], its length is $path[$startnode][$i]\n"; } print "####################################################\n"; } dijkstra(0);