#!/usr/bin/env perl

use strict;
use warnings;

use Graph::Weighted;

my $g = Graph::Weighted->new( undirected => 1 );
$g->populate(
    {
        A => { B => 4, F => 2 },
        B => { C => 6, F => 5 },
        C => { F => 1 },
        D => { },
    },
);

my $tree = $g->MST_Kruskal; # A=B,A=F,C=F
my $sum = edge_sum($tree);
print "Kruskal: $tree : $sum\n";

$tree = $g->MST_Prim; # same
$sum = edge_sum($tree);
print "Prim: $tree : $sum\n";

# https://www.hackerearth.com/practice/algorithms/graphs/minimum-spanning-tree/tutorial/
$g = Graph::Weighted->new( undirected => 1 );
$g->populate(
    {
        A => { B => 1, C => 7 },
        B => { A => 1, C => 5, D => 4, E => 3 },
        C => { A => 7, B => 5, E => 6 },
        D => { B => 4, E => 2 },
        E => { B => 3, C => 6 },
    },
);

$tree = $g->MST_Kruskal; # A=B,A=F,C=F
$sum = edge_sum($tree);
print "Kruskal: $tree : $sum\n";

$tree = $g->MST_Prim; # same
$sum = edge_sum($tree);
print "Prim: $tree : $sum\n";

sub edge_sum {
    my ($tree) = @_;
    my $sum = 0;
    my @edges = split /,/, $tree;
    for my $edge (@edges) {
        my @edge = split /=/, $edge;
        $sum += $g->get_cost(\@edge);
    }
    return $sum;
}
