Deux sommets distincts dans un graphe orienté sont fortement connectés s'il y a un chemin dans le graphe l'un de l'autre. Un composant fortement connecté du graphe est un sous-ensemble du graphe tel que chaque paire de sommets distincts dans le sous-ensemble est fortement connectée, et l'ajout de sommets supplémentaires au sous-ensemble briserait cette propriété.
Votre défi consiste à séparer un graphique en ses composants fortement connectés. Plus précisément, vous devez générer tous les SCC dans le graphique.
E / S:
En entrée, vous pouvez utiliser une liste de bords dirigés, une liste d'adjacence, une matrice d'adjacence ou tout autre format d'entrée raisonnable. Demandez si vous n'êtes pas sûr. Vous pouvez supposer que le graphique n'a pas de sommets totalement déconnectés et qu'il n'y a pas de bords autonomes, mais vous ne pouvez pas émettre d'autres hypothèses. Vous pouvez également éventuellement prendre la liste des sommets en entrée, ainsi que le nombre de sommets.
En sortie, vous devez soit donner un partitionnement des sommets, comme une liste de listes de sommets, où chaque sous-liste est un composant fortement connecté, soit un étiquetage des sommets, où chaque étiquette correspond à un composant différent.
Si vous utilisez un étiquetage, les étiquettes doivent être soit des sommets, soit une séquence consécutive d'entiers. C'est pour éviter de transférer le calcul dans les étiquettes.
Exemples:
Ces exemples prennent des listes d'arêtes, où chaque arête est dirigée de la première entrée vers la deuxième entrée, et des partitions de sortie. Vous êtes libre d'utiliser ce format ou un autre.
L'entrée est sur la première ligne, la sortie est sur la deuxième ligne.
[[1, 2], [2, 3], [3, 1], [1, 4]]
[[1, 2, 3], [4]]
[[1, 2], [2, 3], [3, 4]]
[[1], [2], [3], [4]]
[[1, 2], [2, 1], [1, 3], [2, 4], [4, 2], [4, 3]]
[[1, 2, 4], [3]]
[[1, 2], [2, 3], [2, 5], [2, 6], [3, 4], [3, 7], [4, 3], [4, 8], [5, 1], [5, 6], [6, 7], [7, 6], [8, 7], [8, 4]]
[[1, 2, 5], [3, 4, 8], [6, 7]]
Notation et restrictions:
Les failles standard sont interdites, comme toujours. De plus, les modules intégrés qui traitent spécifiquement des composants fortement connectés sont interdits.
Les solutions devraient fonctionner en moins d'une heure sur les exemples fournis. (Ceci est destiné à empêcher les solutions exponentielles lentes, et rien d'autre.)
C'est le golf de code. Le moins d'octets gagne.
8
n'est pas dans un composant avec [3,4]
car il ne peut pas seulement chacun 6
et 7
(ni l'un ni l'autre ne l'atteindre).