Graph-Undirected-Hamiltonicity
view release on metacpan or search on metacpan
lib/Graph/Undirected/Hamiltonicity/Transforms.pm view on Meta::CPAN
output( $required_graph, { required => 1 } );
} else {
output("The required graph has no edges.<BR/>");
}
return ( $required_graph, $g1 );
}
##########################################################################
# For each required walk, delete the edge connecting its endpoints,
# as such an edge would make the graph non-Hamiltonian, and therefore
# the edge can never be part of a Hamiltonian cycle.
sub delete_cycle_closing_edges {
output("Entering delete_cycle_closing_edges()<BR/>");
my ($g, $required_graph) = @_;
my $deleted_edges = 0;
my $g1;
my %eliminated;
lib/Graph/Undirected/Hamiltonicity/Transforms.pm view on Meta::CPAN
my @reachable = $required_graph->all_reachable($vertex);
my ( $other_vertex ) = grep { $required_graph->degree($_) == 1 } @reachable;
$g1 //= $g->deep_copy_graph();
next unless $g1->has_edge($vertex, $other_vertex);
$g1->delete_edge($vertex, $other_vertex);
$required_graph->delete_edge($vertex, $other_vertex);
$deleted_edges++;
output( "Deleted edge $vertex=$other_vertex"
. ", between endpoints of a required walk.<BR/>" );
}
if ( $deleted_edges ) {
my $s = $deleted_edges == 1 ? '' : 's';
output("Shrank the graph by removing $deleted_edges edge$s.<BR/>");
return ( $deleted_edges, $g1 );
} else {
output("Did not shrink the graph.<BR/>");
return ( $deleted_edges, $g );
}
lib/Graph/Undirected/Hamiltonicity/Transforms.pm view on Meta::CPAN
#
# Returns a Graph::Undirected object, constructed from its string form.
sub string_to_graph {
my ($string) = @_;
my %vertices;
my @edges;
foreach my $chunk ( split( /\,/, $string ) ) {
if ( $chunk =~ /=/ ) {
my @endpoints = map {s/\b0+([1-9])/$1/gr}
split( /=/, $chunk );
next if $endpoints[0] == $endpoints[1];
push @edges, \@endpoints;
$vertices{ $endpoints[0] } = 1;
$vertices{ $endpoints[1] } = 1;
} else {
$vertices{$chunk} = 1;
}
}
my @vertices = keys %vertices;
my $g = Graph::Undirected->new( vertices => \@vertices );
foreach my $edge_ref (@edges) {
$g->add_edge(@$edge_ref) unless $g->has_edge(@$edge_ref);
lib/Graph/Undirected/Undirected/Hamiltonicity/Transforms.pm view on Meta::CPAN
output( $required_graph, { required => 1 } );
} else {
output("The required graph has no edges.<BR/>");
}
return ( $required_graph, $g1 );
}
##########################################################################
# For each required walk, delete the edge connecting its endpoints,
# as such an edge would make the graph non-Hamiltonian, and therefore
# the edge can never be part of a Hamiltonian cycle.
sub delete_cycle_closing_edges {
output("Entering delete_cycle_closing_edges()<BR/>");
my ($g, $required_graph) = @_;
my $deleted_edges = 0;
my $g1;
my %eliminated;
lib/Graph/Undirected/Undirected/Hamiltonicity/Transforms.pm view on Meta::CPAN
my @reachable = $required_graph->all_reachable($vertex);
my ( $other_vertex ) = grep { $required_graph->degree($_) == 1 } @reachable;
$g1 //= $g->deep_copy_graph();
next unless $g1->has_edge($vertex, $other_vertex);
$g1->delete_edge($vertex, $other_vertex);
$required_graph->delete_edge($vertex, $other_vertex);
$deleted_edges++;
output( "Deleted edge $vertex=$other_vertex"
. ", between endpoints of a required walk.<BR/>" );
}
if ( $deleted_edges ) {
my $s = $deleted_edges == 1 ? '' : 's';
output("Shrank the graph by removing $deleted_edges edge$s.<BR/>");
return ( $deleted_edges, $g1 );
} else {
output("Did not shrink the graph.<BR/>");
return ( $deleted_edges, $g );
}
lib/Graph/Undirected/Undirected/Hamiltonicity/Transforms.pm view on Meta::CPAN
#
# Returns a Graph::Undirected object, constructed from its string form.
sub string_to_graph {
my ($string) = @_;
my %vertices;
my @edges;
foreach my $chunk ( split( /\,/, $string ) ) {
if ( $chunk =~ /=/ ) {
my @endpoints = map {s/\b0+([1-9])/$1/gr}
split( /=/, $chunk );
next if $endpoints[0] == $endpoints[1];
push @edges, \@endpoints;
$vertices{ $endpoints[0] } = 1;
$vertices{ $endpoints[1] } = 1;
} else {
$vertices{$chunk} = 1;
}
}
my @vertices = keys %vertices;
my $g = Graph::Undirected->new( vertices => \@vertices );
foreach my $edge_ref (@edges) {
$g->add_edge(@$edge_ref) unless $g->has_edge(@$edge_ref);
( run in 1.081 second using v1.01-cache-2.11-cpan-2b1a40005be )