my @E = ([1,3],[1,5],[2,3],[2,4],[2,5],[4,5]); my $V = 5; my $verbose = 1; my @all_edges = map { my $x = $_; map { [$x, $_] } $x+1 .. $V } 1 .. $V-1; my $string = (join(' ', 1 .. $V) . "\n") x $V . "\n" . (join(' ', map { join "-", @$_ } @all_edges ) . "\n") x @all_edges . "\n" . (join(' ', map { join "-", @$_ } @E ) . "\n") x $V; my $regex = "^ " . ".* \\b (\\d+) \\b .* \\n\n" x $V . "\\n\n" . join("", map { my ($x, $y) = @$_; ".* \\b (?: \\$x-\\$y | \\$y-\\$x ) \\b .* \\n\n" } @all_edges) . "\\n\n" . join("", map { my ($x, $y) = ($_, $_+1); ".* \\b (?: \\$x-\\$y | \\$y-\\$x ) \\b .* \\n\n" } 1 .. ($V-1)) . ".* \\b (?: \\$V-\\1 | \\1-\\$V ) \\b .* \\n \$\n"; print "'$string' =~ /\n$regex\n/x\n" if $verbose; if (my @c = $string =~ /$regex/x) { local $" = " -> "; print "Hamiltonian circuit: [ @c -> $1 ]\n"; } else { print "No Hamiltonian circuit\n"; }