Wie um zu überprüfen, ob eine Kante in einem Kreislauf?
Habe ich ein hw-problem fragt nach einem Algorithmus, der erkennt, wenn es jedem Zyklus in jedem ungerichteten Graphen mit gegebenen Rand 'E'. Der Algorithmus, der ausgeführt werden soll in O(N) lineare Zeit.
Das problem, das ich habe ist, dass ich don T wissen, wo zu beginnen. Ich habe einige einfache Beispiel-Graphen, aber ich weiß nicht, wo Sie gehen von dort aus.
Irgendwelche Tipps?
- Einen Tip??? Sicher. Manche sets (wie hashsets) O(1) lookup.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Herausnehmen, die Kante (u,v) aus G.
1. Laufen BFS um zu sehen, ob v ist noch erreichbar von u.
2. wenn ja, dann wird der ursprüngliche graph einen Zyklus enthält. e. ansonsten gibt es nicht.
Tun eine Tiefe ersten Suche hinzufügen von Knoten zu einer Liste, wie Sie gehen, und entfernen Sie Sie aus der Liste, wie Sie zurück.
Die Liste zeigt Ihre aktuellen Pfad-traversal.
Wenn Sie auf einen Knoten, der bereits in der Liste ist, dann gibt es ein loop/cycle.
Beginnen Sie mit der Kante 'e'. Von ihm sollten Sie sich die zwei Eckpunkte verbindet. Von Ihnen erhalten Sie auch andere Kanten und anderen Ecken und anderen Kanten und andere Knoten, und... müssen Sie einen Weg, um herauszufinden, ob ein Knoten bereits "besucht", die von Ihrem Algorithmus. Wenn es hat, dann gibt es einen Zyklus, 'e' ein Teil ist.
Für die Kante (u,v):
1 - führen Sie eine Tiefe erste Suche ab u, zu bestimmen, ob v ist und eine hintere Kante existiert auf dem Pfad zu v.
2 - führen Sie eine Tiefe erste-Suche von v, wenn u gefunden, und der hintere Rand existieren u, dann gibt es einen Zyklus, das sowohl u und v.
In anderen Worten,
1 - führen Sie eine DFS-ab u prüfen, ob der hintere Rand existiert, und v ist noch nicht fertig.
2 - führen Sie eine DFS-ab v prüfen, ob der hintere Rand existieren und u ist noch nicht fertig
wenn beide Bedingungen erfüllt sind, dann die Kante(u,v) gehören zu einem Zyklus.
Führen Sie DFS auf G und tun die folgende. Betrachten wir das erste mal die Kante e Durchlaufen wird.
Gibt es zwei Fälle:
Algorithmus. Für jeden back-Kante (w, x) in DFS, überprüfen Sie, ob w ein Nachfahre von v und x
ein Vorfahr von u. Wenn dem so ist, haben wir einen Kreislauf, einschließlich der Kante e.