#!/usr/bin/perl use strict; use warnings; # # Input, lines of the figure. # my @l = ( [qw [A B]], [qw [A C F I]], [qw [A D G J]], [qw [A E]], [qw [B C D E]], [qw [B F H J]], [qw [B I]], [qw [E G H I]], [qw [E J]], [qw [I J]], ); # Process the lines. Create a datastructure with nodes as keys. # For each node, record which nodes are reachable in one step, # and which nodes are passed to get there. my $g; foreach my $l (@l) { for (my $i1 = 0; $i1 < @$l-1; $i1++) { for (my $i2 = $i1+1; $i2 < @$l; $i2++) { $$g{$$l[$i1]}{$$l[$i2]} = {map {$_, 1} @$l[$i1+1 .. $i2-1]}; $$g{$$l[$i2]}{$$l[$i1]} = {map {$_, 1} @$l[$i1+1 .. $i2-1]}; } } } # Find all non-trivial 3-cycles. local $" = " - "; my @n = sort keys %$g; for (my $i1 = 0; $i1 < @n-2; $i1++) { for (my $i2 = $i1+1; $i2 < @n-1; $i2++) { for (my $i3 = $i2+1; $i3 < @n; $i3++) { # Form a cycle print "@n[$i1,$i2,$i3]\n" if $$g{$n[$i1]}{$n[$i2]} && $$g{$n[$i2]}{$n[$i3]} && $$g{$n[$i3]}{$n[$i1]} && # Avoid trivial cycle !$$g{$n[$i1]}{$n[$i2]}{$n[$i3]} && !$$g{$n[$i1]}{$n[$i3]}{$n[$i2]} && !$$g{$n[$i2]}{$n[$i3]}{$n[$i1]}; } } } __END__ A - B - C A - B - D A - B - E A - B - F A - B - I A - B - J A - C - D A - C - E A - D - E A - E - G A - E - I A - E - J A - F - J A - G - I A - I - J B - C - F B - C - I B - D - J B - E - H B - E - I B - E - J B - F - I B - H - I B - I - J C - E - I D - E - G D - E - J E - G - J E - H - J E - I - J F - H - I F - I - J G - H - J G - I - J H - I - J