Nehmen wir an, wir haben ein einfaches ungerichtetes Diagramm angegeben haben Knoten und bidirektionale Kanten. Für gegeben und Wir möchten überprüfen, ob es in der Grafik nur einen einfachen Pfad zwischen ihnen gibt.
Ich dachte daran, dass wir alle Zyklen in der Grafik finden und bfs ausführen sollten zu Wenn sich der Pfad nicht durch die Scheitelpunkte bewegt, die sich in einem Zyklus befinden, gibt es nur einen Pfad, und ansonsten gibt es mehr.
Gibt es eine andere Möglichkeit, dies zu überprüfen?
algorithms
graphs
shortest-path
jemand12321
quelle
quelle
Antworten:
Raphaels Vorschlag, den kürzesten Weg zu verwenden, ist richtig, aber komplexer als nötig.
Ihr Ansatz ist nicht durchführbar, die Anzahl der Zyklen hängt von der Größe der Eingabe ab.
Hier ist eine Skizze einer zeitlichen LösungO(|V|+|E|) .
Finde einen Wegp1,…pn von x zu y im O(|V|+|E|) . Wenn kein solcher Pfad vorhanden ist, antworten SieNO . Andernfalls markieren Sie alle Knoten im Pfad. Dieser Pfad ist in der Tat genau dann eindeutig, wenn kein Knoten in diesem Pfad einen nachfolgenden Knoten erreicht. Ausgehend vom ersten Knoten des Pfadesp1 Wählen Sie eine zufällige Kante aus p1 anders als der, mit dem es verbunden ist p2 und starten Sie von dort aus eine DFS. Wenn Sie einen markierten Knoten erreichen, antworten SieNO Wenn Sie nie einen markierten Knoten erreichen, schneiden Sie diesen Zweig aus dem Diagramm aus und wählen Sie eine andere zufällige ausgehende Kante aus. Fahren Sie auf ähnliche Weise fort, bis alle ausgehenden Kanten erschöpft sind, und beginnen Sie dann erneut mit dem folgenden Knoten, bis Sie erreichenpn . Wenn Sie den Vorgang beenden, ohne jemals zu antwortenNO , Antworten YES . Das gesamte Verfahren hat die Kosten einer DFS,O(|V|+|E|) , daher ist die Gesamtzeit O(|V|+|E|) .
quelle
Führen Sie einen k-kürzesten Pfad- Algorithmus mit ausk=2 und beobachten, ob es fehlschlägt.
quelle
Wenn es einen Pfad von der Quelle gibtx zu einem bestimmten Zyklus widerspricht es nicht immer der Existenz eines einzigen einfachen Pfades. Schauen Sie sich das folgende Beispiel an:
Hier gibt es einen Zyklus, von dem aus man erreichen kannx und y . Dieses Problem kann in gelöst werdenO(|V|+|E|) .
Sie können BFS ausführen, um die kürzeste Entfernung von zu findenx zu jedem Scheitelpunkt im Diagramm und das gleiche von y . Ein Knoten gehört zum kürzesten Weg vonx zu y dann und nur dann, wenn
quelle
Führen Sie eine Tiefensuche durch, die in beginntx und kommentieren Sie Kanten danach, ob es sich um Baum-, Rücken- oder Kreuzkanten handelt (vgl. z. B. hier ).
Es gibt mehr als einen einfachen Weg vonx zu y genau dann, wenn (mindestens) ein Knoten auf dem Pfad von ist x zu y Verwenden Sie nur Baumkanten (dh den von DFS gefundenen Pfad), die auf eine Hinter- oder Querkante treffen.
quelle