Graph-Undirected-Hamiltonicity
view release on metacpan or search on metacpan
lib/Graph/Undirected/Undirected/Hamiltonicity/Transforms.pm view on Meta::CPAN
package Graph::Undirected::Hamiltonicity::Transforms;
use Modern::Perl;
use Carp;
use Graph::Undirected;
use Graph::Undirected::Hamiltonicity::Output qw(:all);
use Exporter qw(import);
our @EXPORT_OK = qw(
&add_random_edges
&delete_cycle_closing_edges
&delete_non_required_neighbors
&get_common_neighbors
&get_required_graph
&get_random_isomorph
&string_to_graph
&swap_vertices
);
our %EXPORT_TAGS = ( all => \@EXPORT_OK );
##########################################################################
# The "required graph" contains the same vertices as the original graph,
# but with only the edges incident on vertices of degree == 2.
sub get_required_graph {
my ($g) = @_;
output( "Beginning a sweep to mark all edges adjacent to degree 2 "
. "vertices as required:<BR/>" );
my $g1 = $g->deep_copy_graph();
output($g1);
my @vertices = $g1->vertices();
my $required_graph = Graph::Undirected->new( vertices => \@vertices );
foreach my $vertex (@vertices) {
my $degree = $g1->degree($vertex);
if ( $degree != 2 ) {
output("Vertex $vertex : Degree=[$degree] ...skipping.<BR/>");
next;
}
output("Vertex $vertex : Degree=[$degree] ");
output("<UL>");
foreach my $neighbor_vertex ( $g1->neighbors($vertex) ) {
$required_graph->add_edge( $vertex, $neighbor_vertex );
if ( $g1->get_edge_attribute( $vertex, $neighbor_vertex,
'required') ) {
output( "<LI>$vertex=$neighbor_vertex is already "
. "marked required</LI>" );
next;
}
$g1->set_edge_attribute($vertex, $neighbor_vertex,
'required', 1);
output( "<LI>Marking $vertex=$neighbor_vertex "
. "as required</LI>" );
( run in 0.806 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )