Einführung
Bei einem ungerichteten Graphen G können wir einen Graphen L (G) (als Liniendiagramm oder konjugierter Graph bezeichnet) konstruieren, der die Verbindungen zwischen Kanten in G darstellt. Dazu wird für jede Kante in ein neuer Scheitelpunkt in L (G) erstellt G und Verbinden dieser Eckpunkte, wenn die Kanten, die sie darstellen, einen gemeinsamen Eckpunkt haben.
Hier ist ein Beispiel aus Wikipedia, das den Aufbau eines Liniendiagramms (in grün) zeigt.
Nehmen Sie als weiteres Beispiel diesen Graphen G mit den Eckpunkten A, B, C und D.
A
|
|
B---C---D---E
Wir erstellen einen neuen Scheitelpunkt für jede Kante in G. In diesem Fall wird die Kante zwischen A und C durch einen neuen Scheitelpunkt namens AC dargestellt.
AC
BC CD DE
Und verbinden Sie Scheitelpunkte, wenn die Kanten, die sie darstellen, einen gemeinsamen Scheitelpunkt haben. In diesem Fall haben die Kanten von A nach C und von B nach C den Scheitelpunkt C gemeinsam, sodass die Scheitelpunkte AC und BC verbunden sind.
AC
/ \
BC--CD--DE
Dieses neue Diagramm ist das Liniendiagramm von G!
Weitere Informationen finden Sie in Wikipedia.
Herausforderung
Angesichts der Adjazenzliste für ein Diagramm G sollte Ihr Programm die Adjazenzliste für das Liniendiagramm L (G) drucken oder zurückgeben. Dies ist Code-Golf, also gewinnt die Antwort mit den wenigsten Bytes!
Eingang
Eine Liste von Zeichenfolgenpaaren, die die Kanten von G darstellen. Jedes Paar beschreibt die Eckpunkte, die durch diese Kante verbunden sind.
- Jedes Paar (X, Y) ist garantiert eindeutig, was bedeutet, dass die Liste weder (Y, X) noch eine Sekunde (X, Y) enthält.
Zum Beispiel:
[("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")]
[("D","E"),("C","D"),("B","C"),("A","C")]
Ausgabe
Eine Liste von Zeichenfolgenpaaren, die die Kanten von L (G) darstellen. Jedes Paar beschreibt die Eckpunkte, die durch diese Kante verbunden sind.
Jedes Paar (X, Y) muss eindeutig sein, was bedeutet, dass die Liste weder (Y, X) noch eine Sekunde (X, Y) enthält.
Für jede Kante (X, Y) in G muss der Scheitelpunkt, den sie in L (G) erstellt, XY heißen (die Namen werden in derselben Reihenfolge miteinander verknüpft, in der sie in der Eingabe angegeben sind).
Zum Beispiel:
[("12","13"),("12","14"),("12","25"),("13","14"),("13","34"),("14","34"),("14","45"),("25","45"),("34","45")]
[("DE","CD"),("CD","CB"),("CD","CA"),("BC","AB")]
Testfälle
[] -> []
[("0","1")] -> []
[("0","1"),("1","2")] -> [("01","12")]
[("a","b"),("b","c"),("c","a")] -> [("ab","bc"),("bc","ca"),("ca","ab")]
[("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")] -> [("12","13"),("12","14"),("12","25"),("13","14"),("13","34"),("14","34"),("14","45"),("25","45"),("34","45")]
[("1","23"),("23","4"),("12","3"),("3","4")]
, für die die Ausgabe vermutlich sein sollte, ausschließt[("123","234"),("123","34")]
, was nicht richtig interpretiert werden kann. Ich denke, die einzige Möglichkeit, dies zu beheben, besteht darin, zu garantieren, dass die Eingabe niemals solche Mehrdeutigkeiten enthält. Wenn diese Frage jedoch in der Sandbox veröffentlicht worden wäre, hätte ich vorgeschlagen, die Benennung von Scheitelpunkten in der Ausgabe weniger genau zu bestimmen.