in reply to Re^2: Sub set where all are connected
in thread Sub set where all are connected

#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11109069 use warnings; use List::Util qw( uniq ); my $edges = <<END; [1,2], [1,3], [1,4], [1,5], [2,3], [2,4], [3,4], [5,6], [5,7], [5,9], [6,9], [7,8], [8,9], END $edges =~ s/(?<=\[)[\w,]+(?=\])/ join ',', sort split ',', $& /ge; # +fix order #print "$edges\n"; my %alldirect; my %seen; find( uniq sort $edges =~ /\w+/g ); # start with e +very node sub find { $seen{ "@_" }++ and return; if( my @out = "@_:$edges" =~ /\b(\w+)\b.+\b(\w+)\b.*:(?!.*?\[\1,\2\] +)/s ) { for my $node ( @out ) # pair of unconnected nodes, try without + each one { find( grep $_ ne $node, @_ ); } } else { $alldirect{ "@_" }++; # it is fully +connected } } my @seq = sort keys %alldirect; my %subset; # remove subsets of +supersets for my $sub ( @seq ) { for my $super ( @seq ) { if( length $sub < length $super and !$subset{$super} and "$sub\n$super" !~ /\b(\w+)\b.*\n(?!.*\b\1\b)/ ) # sub node +not found { $subset{$sub}++; last; } } } my @directlyconnected = grep !$subset{$_}, @seq; print "$_\n" for @directlyconnected;;

Outputs :

1 2 3 4 1 5 5 6 9 5 7 7 8 8 9

Note: I think your expected output is wrong. 1 2 3 4 are all strongly connected and belong in the same subset.

Quick explanation:
Top down approach. Start with set of all nodes.
Try to find unconnected pair of nodes, if so, try with two subsets, each with one of those nodes.
If no unconnected pair, have a directly connected subset!
Second half eliminates valid subsets of larger valid subsets.

Replies are listed 'Best First'.
Re^4: Sub set where all are connected
by LanX (Saint) on Nov 23, 2019 at 17:38 UTC
    > Note: I think your expected output is wrong. 1 2 3 4 are all strongly connected and belong in the same subset.

    You are right, he c&p'ed the synopsis from Graph::Clique which shows all k-cliques for k=3 only.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Re^4: Sub set where all are connected
by LanX (Saint) on Nov 23, 2019 at 18:09 UTC
    If you want bigger (and visualized) test data you can parse the SVG example inside the Clique_(graph_theory) WP page.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

      Looks OK

      1 2 3 4 10 13 9 10 8 9 11 12 13 9 13 14 14 15 14 21 15 16 17 15 17 19 17 18 19 18 19 20 18 19 21 19 21 22 20 23 21 22 23 23 4 4 5 5 6 7 5 7 8
        Yes but how much longer did it take with 23 points instead of 9?

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

      parse the SVG example

      It just reminded me of an exam at university. It read thus:

      Under your desk there is a red telephone.
      Pick it up and dial 0.
      Shout: "Товарищи, я хочу начать термоядерную войну."
      Shout once more: "Товарищи, я хочу начать термоядерную войну."
      Hang up and rush to the University's bunker.
      Study the environment and atmosphere and report on the next 24, 48 and 72 hours.
      

      Or something like this, :) bw, bliako

        I must say, you've been at a weird university.

        Anyway tybalt89 is очень хорошо с регексом. (... Or в регексе?)

        So parsing some SVG to get points and edges is просто для его.

        But thanks, I'll certainly profit from this new vocabulary next time I have to ask где туалет...

        ;)

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice