use Graph::Undirected; my @colors = qw( black white red green blue cyan magenta yellow); my @combos = ( [qw(black cyan yellow)], [qw(red white blue)], [qw(white blue)], [qw(green red)], [qw(cyan magenta)], [qw(yellow magenta)], [qw(magenta cyan)], [qw(magenta black yellow)], ); my $g = Graph::Undirected->new(@colors); for my $combo (@combos) { # Special case of all @$combo <= 3, the following # can be replaced by: # $g->add_cycle( @$combo); for my $pick (0..$#$combo-1) { $g->add_edge( $combo->[$pick], $combo->[$_]) for $pick+1..$#$combo; } } my @components = $g->strongly_connected_components; print "@$_", $/ for @components;