Das Ziel dieser Herausforderung ist ein endlich gerichteter azyklischer Graph (DAG), der bestimmt, ob der Graph eine transitive Reduktion ist .
Eine kurze Erklärung, was eine DAG und transitive Reduktionen sind:
Eine DAG ist ein Diagramm mit gerichteten Kanten (dh Sie können an dieser Kante nur in eine Richtung fahren), sodass es bei einem beliebigen Startknoten im Diagramm unmöglich ist, zum Startknoten zurückzukehren (dh es gibt keine Zyklen).
Wenn es bei einem beliebigen Startknoten möglich ist, über eine beliebige positive Anzahl von Kanten zu einem anderen Endknoten im Diagramm zu gelangen, wird dieser Endknoten als vom Startknoten aus erreichbar definiert. In einer allgemeinen DAG kann es mehrere Pfade geben, die von einem Startknoten zu einem Zielendknoten genommen werden können. Nehmen Sie zum Beispiel dieses Diamantdiagramm:
Um zu Knoten D
aus A
, könnte nehmen Sie den Weg A->B->D
oder A->C->D
. Somit D
ist erreichbar von A
. Es gibt jedoch keinen Pfad, der verwendet werden kann, um B
vom Knoten zum Knoten zu gelangen C
. Somit ist der Knoten B
vom Knoten nicht erreichbar C
.
Definieren Sie die Erreichbarkeit des Diagramms als Liste der erreichbaren Knoten für jeden Startknoten im Diagramm. Für das gleiche Beispiel eines Diamantgraphen ist die Erreichbarkeit also:
A: [B, C, D]
B: [D]
C: [D]
D: []
Ein weiteres Diagramm mit der gleichen Erreichbarkeit wie das obige Diagramm ist unten dargestellt:
Dieses zweite Diagramm hat jedoch mehr Kanten als das ursprüngliche Diagramm. Die transitive Reduzierung eines Diagramms ist ein Diagramm mit der geringsten Anzahl von Kanten und der gleichen Erreichbarkeit des ursprünglichen Diagramms. Der erste Graph ist also die transitive Reduktion des zweiten.
Für eine endliche DAG ist die transitive Reduktion garantiert und einzigartig.
Eingang
Die Eingabe ist eine "Liste von Listen", wobei die externe Liste die Länge der Anzahl der Scheitelpunkte hat und jede interne Liste die Länge der Anzahl der Kanten ist, die den zugeordneten Knoten verlassen, und die Indizes der Zielknoten enthält. Eine Möglichkeit zur Beschreibung des ersten Diagramms oben wäre beispielsweise (unter der Annahme einer auf Null basierenden Indizierung):
[[1, 2], [3], [3], []]
Sie können mit der Indizierung des ersten Knotens bei einem beliebigen ganzzahligen Wert beginnen (z. B. 0- oder 1-basierte Indizierung).
Die Eingabe kann von jeder gewünschten Eingangsquelle stammen (Standard, Funktionsparameter usw.). Sie können das genaue Eingabeformat frei wählen, solange keine zusätzlichen Informationen angegeben werden. Wenn Sie beispielsweise Eingaben von stdio übernehmen möchten, kann jede Zeile eine Liste von Kanten für den zugeordneten Knoten sein. Ex.:
1 2
3
3
'' (blank line)
Die Indizes in jeder Adjazenzliste sind nicht unbedingt sortiert, und es können mehrere Kanten vorhanden sein, die zwei Knoten verbinden (z. B. :) [[1,1],[]]
. Sie können davon ausgehen, dass der Eingabediagramm schwach verbunden ist und keine Zyklen enthält (dh es handelt sich um eine DAG).
Ausgabe
Die Ausgabe ist wahr, wenn die gegebene Eingangs-DAG eine transitive Reduktion ist, und ansonsten ein falscher Wert. Dies kann für jede gewünschte Senke gelten (stdio, Rückgabewert, Ausgabeparameter usw.)
Beispiele
Alle Beispiele verwenden eine 0-basierte Indizierung.
[[1,2],[3],[3],[]]
true
[[1,2,3],[3],[3],[]]
false
[[1,1],[]]
false
[[1,2,3,4],[5,6,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4,14,5,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10,14],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[1,3],[2],[3],[]]
false
Wertung
Das ist Code Golf; kleinster Code in Bytes gewinnt. Ihr Code sollte in angemessener Zeit abgeschlossen sein (maximal 10 Minuten auf jeder Hardware, die Sie haben). Es gelten Standardlücken. Sie können alle gewünschten integrierten Funktionen verwenden.
quelle
Antworten:
Ruby,
10197 BytesEinfacher Ansatz, der die Reichweite von jedem Knoten berechnet und berücksichtigt, ob ein untergeordneter Knoten über einen der anderen Knoten erreicht werden kann. Scheint in zyklischen Graphen scheinbar zu versagen, aber die Definition einer DAG impliziert, dass sie sowieso nicht zyklisch sein sollte.
Probieren Sie es online aus!
quelle
Mathematica,
9582 Bytes13 Bytes aufgrund von @MartinEnder gespeichert .
Anonyme Funktion. Nimmt eine verschachtelte Liste als (1-basierte) Eingabe und gibt sie zurück
True
oderFalse
als Ausgabe. Die Hauptlösung ist hier das 46-Byte#~IsomorphicGraphQ~TransitiveReductionGraph@#&
, das prüft, ob ein gegebener Graph zu seiner transitiven Reduktion isomorph ist. Der Rest konvertiert die Eingabe in einGraph
Objekt.quelle
CJam (41 Bytes)
Online-Demo , Testgeschirr
Präparation
quelle
Gelee, 20 Bytes
Verwendet 1-basierte Indizierung. Probieren Sie es online aus!
Lose Übersicht
quelle