Ein gemischtes Diagramm ist ein Diagramm, das sowohl gerichtete als auch ungerichtete Kanten haben kann. Das zugrunde liegende ungerichtete Diagramm wird erhalten, indem die Ausrichtungen der gerichteten Kanten vergessen werden, und in der anderen Richtung wird eine Ausrichtung eines gemischten Diagramms erhalten, indem jeder ungerichteten Kante eine Richtung zugewiesen wird. Ein Satz von Kanten bildet einen Zyklus in einem gemischten Diagramm, wenn er so ausgerichtet werden kann, dass er einen gerichteten Zyklus bildet. Ein gemischter Graph ist genau dann azyklisch, wenn er keine Zyklen hat.
Dies ist alles Standard und es gibt viele veröffentlichte Artikel, die azyklische gemischte Grafiken erwähnen. Daher muss der folgende Algorithmus zum Testen der Azyklizität gemischter Graphen bekannt sein:
Wiederholen Sie die folgenden Schritte:
- Entfernen Sie alle Scheitelpunkte, die keine ankommenden gerichteten Kanten und keine ungerichteten Kanten aufweisen, da sie nicht Teil eines Zyklus sein können.
- Wenn ein Scheitelpunkt keine ankommenden gerichteten Kanten, aber genau eine ankommende ungerichtete Kante hat, muss jeder Zyklus, der die ungerichtete Kante verwendet, an dieser Kante eintreten. Ersetzen Sie die ungerichtete Kante durch eine ankommende gerichtete Kante.
Stoppen Sie, wenn keine weiteren Schritte ausgeführt werden können. Wenn das Ergebnis ein leerer Graph ist, muss der ursprüngliche Graph notwendigerweise azyklisch gewesen sein. Andernfalls kann man ausgehend von einem verbleibenden Scheitelpunkt bei jedem Schritt, der rückwärts durch eine ankommende Kante oder einer ungerichteten Kante folgt, die nicht zum Erreichen des aktuellen Scheitelpunkts verwendet wird, durch den Graphen zurückverfolgen, bis ein wiederholter Scheitelpunkt angezeigt wird. Die zwischen der ersten und der zweiten Wiederholung dieses Scheitelpunkts (in umgekehrter Reihenfolge) verfolgte Folge von Kanten bildet einen Zyklus im gemischten Graphen.
Der Wikipedia-Artikel über gemischte Graphen erwähnt azyklische gemischte Graphen, erwähnt jedoch nicht, wie sie getestet werden sollen. Deshalb möchte ich etwas zu diesem Algorithmus hinzufügen, aber dafür benötige ich eine veröffentlichte Referenz. Kann mir jemand sagen, wo es (oder ein anderer Algorithmus zum Testen der Azyklizität) in der Literatur vorkommt?
quelle
Antworten:
Das Auffinden von gemischten Zyklen in einem gemischten Graphen entspricht dem Auffinden von elementaren gerichteten Zyklen (mit einer Länge> = 3) in dem entsprechenden gerichteten Graphen. Das entsprechende gerichtete Diagramm wird aus dem gemischten Diagramm erhalten, indem jede ungerichtete Kante durch zwei gerichtete Kanten ersetzt wird, die in entgegengesetzte Richtungen zeigen. Beweis: (1) Jeder elementar gerichtete Zyklus (mit einer Länge> = 3) im Digraphen entspricht direkt einem gemischten Zyklus im gemischten Graphen. (2) Jeder gemischte Zyklus in dem gemischten Graphen enthält einen elementaren gemischten Zyklus mit einer Länge> = 3, und jeder derartige Zyklus entspricht direkt einem elementaren gerichteten Zyklus (mit einer Länge> = 3) in dem gerichteten Graphen. (1) und (2) beweisen zusammen beide Richtungen der Aussage, qed. Wir suchen also nach Referenzen, wie man (alle?) Elementarzyklen (mit einer Länge> = 3) in einem gerichteten Graphen berechnet.
Die Kommentare weisen darauf hin, dass cs.stackexchange einige Antworten auf diese Frage enthält, es jedoch unklar ist, wie die Ergebnisse in einer präzisen Antwort zusammengefasst werden sollen. Dieser Blog-Beitrag fasst die (wichtigsten?) Referenzen gut zusammen:
Der Azyklizitätstest selbst scheint einfach zu sein: Berechnen Sie die stark verbundenen Komponenten des Graphen. Jeder (Elementar-) Zyklus ist vollständig in einer stark verbundenen Komponente enthalten. Eine stark verbundene Komponente enthält einen Elementarzyklus, wenn es sich nicht um einen ungerichteten Baum handelt.
David Eppsteins vorgeschlagener Algorithmus berechnet zusätzlich einen Elementarzyklus als Beweis und die obigen Algorithmen zählen alle Elementarzyklen auf. Jeder Scheitelpunkt oder jede Kante, die nicht in einem Elementarzyklus enthalten ist, könnte als Vorverarbeitungsschritt gelöscht werden, um die Geschwindigkeit der obigen Algorithmen zu verbessern. David Eppsteins Algorithmus könnte für diesen Zweck verwendet werden, aber selbst wenn er nur für die stark verbundenen Komponenten verwendet wird, werden nicht alle möglichen Scheitelpunkte oder Kanten gelöscht, die gelöscht werden können. Aber selbst wenn es dazu erweitert werden könnte (das Berechnen des blockgeschnittenen Baums ermöglicht zumindest das Löschen jedes möglichen Scheitelpunkts, der gelöscht werden kann), ist unklar, ob dies die Geschwindigkeit der obigen Algorithmen wirklich verbessern würde.
quelle