sub graph_from_degree_sequence { my $v = 'a'; my %e = map +($v++ => $_), @_; my %g; while (1) { # this will only have non-zero-degree vertices my @order = sort { $e{$b} <=> $e{$a} } keys %e # if there aren't any, we're done or last; # if there aren't enough available vertices to # connect to, this degree sequence is no good return if @order < $e{$order[0]}; for (1 .. $e{$order[0]}) { # each vertex's degree is guaranteed to be at # least 1, so if it becomes 0, make it ineligible --$e{$order[$_]} or delete $e{$order[$_]}; # create the edges between the two push @{ $g{$order[0]} }, $order[$_]; push @{ $g{$order[$_]} }, $order[0]; } delete $e{$order[0]}; } return \%g; }