清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#! /usr/bin/perl -w
use strict;
my $filepath = "input3";
my @matrix = ();
my $count;
my $max = 1000;
#read file from path
sub readfile{
open(FD,$filepath) or die "$filepath not exitst!";
foreach my $line (<FD>){
my @keys = split(";",$line);
my @path = ();
foreach my $key (@keys){
push(@path, $key);
}
push(@matrix,\@path);
}
}
#change file from 0 to 1000
sub getpath{
readfile;
$count = $#matrix + 1;
for ( my $i = 0 ; $i < $count ; $i++){
for ( my $j = 0; $j < $count ; $j++){
if ( $i != $j && $matrix[$i][$j] == 0 ){
$matrix[$i][$j] = $max;
}
}
}
}
sub prim{
getpath;
my $startnode = shift;#select where to start
my @dist = (); #select the min path
my @mark = (); #mark whether it has been accessed
my @path = (); #store the path
my $sum = 0; #store the sum length
#init the first node
for ( my $i = 0; $i < $count; $i++){
$dist[$i] = $matrix[$startnode][$i];
}
$mark[$startnode] = 0;
push(@path, "$startnode");
#start to add node
for ( my $j = 1; $j < $count; $j++){
#select the min node
my $min = $max;
my $location = -1;
for ( my $i = 0; $i < $count; $i++){
print " the $j dist is $dist[$i]\n";
}
for ( my $i = 1; $i < $count; $i++){
if( !defined($mark[$i]) and $dist[$i] < $min){
$location = $i;
$min = $dist[$i];
}
}
push(@path, " --> $location");
$mark[$location] = 0;
$sum = $sum + $dist[$location];
#print " $j get location $location min $min \n";
#print "############################################\n";
#update the dist
for ( my $i = 1; $i < $count; $i++){
if ( !defined($mark[$i]) and $matrix[$location][$i] < $dist[$i] ){
$dist[$i] = $matrix[$location][$i];
}
}
}
print "the shortest path sum is: $sum\n";
for ( my $i = 0; $i < $count; $i++){
print "from $i has $path[$i] ";
print " the dist is $dist[$i]\n";
}
}
prim(1);