Zwei verschiedene Eckpunkte in einem gerichteten Graphen sind stark verbunden, wenn der Graphen einen Pfad von einem zum anderen aufweist. Eine stark verbundene Komponente des Diagramms ist eine Teilmenge des Diagramms, sodass jedes Paar unterschiedlicher Scheitelpunkte in der Teilmenge stark verbunden ist, und das Hinzufügen weiterer Scheitelpunkte zur Teilmenge würde diese Eigenschaft aufheben.
Ihre Herausforderung besteht darin, ein Diagramm in seine eng miteinander verbundenen Komponenten zu unterteilen. Insbesondere müssen Sie alle SCCs im Diagramm ausgeben.
I / O:
Als Eingabe können Sie eine Liste gerichteter Kanten, eine Adjazenzliste, eine Adjazenzmatrix oder ein anderes angemessenes Eingabeformat verwenden. Fragen Sie, ob Sie sich nicht sicher sind. Sie können davon ausgehen, dass das Diagramm keine vollständig getrennten Scheitelpunkte hat und dass es keine Selbstkanten gibt, aber Sie können möglicherweise keine weiteren Annahmen treffen. Optional können Sie auch die Liste der Scheitelpunkte als Eingabe sowie die Anzahl der Scheitelpunkte verwenden.
Als Ausgabe müssen Sie entweder eine Partitionierung der Scheitelpunkte angeben, z. B. eine Liste von Scheitelpunktlisten, bei der jede Unterliste eine stark verbundene Komponente ist, oder eine Beschriftung von Scheitelpunkten, bei der jede Beschriftung einer anderen Komponente entspricht.
Wenn Sie eine Beschriftung verwenden, müssen die Beschriftungen entweder Eckpunkte oder eine aufeinanderfolgende Folge von ganzen Zahlen sein. Dies soll verhindern, dass die Berechnung in die Etiketten verschoben wird.
Beispiele:
In diesen Beispielen werden Kantenlisten erstellt, in denen jede Kante vom ersten zum zweiten Eintrag geleitet wird, und Partitionen ausgegeben. Sie können dieses oder ein anderes Format verwenden.
Der Eingang befindet sich in der ersten Zeile, der Ausgang in der zweiten Zeile.
[[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]]
Wertung und Einschränkungen:
Standardlücken sind wie immer verboten. Außerdem sind eingebaute Komponenten, die sich speziell mit stark verbundenen Komponenten befassen, verboten.
Die Lösungen sollten nach den angegebenen Beispielen nicht länger als eine Stunde dauern. (Dies soll langsame exponentielle Lösungen und nichts anderes verhindern.)
Das ist Code Golf. Wenigste Bytes gewinnt.
8
nicht in einer Komponente enthalten ist, [3,4]
da es nicht nur jeder kann 6
und 7
(keiner von beiden kann es erreichen).