463 Stimmen

Bester Algorithmus zur Erkennung von Zyklen in einem gerichteten Graphen

Gibt es einen effizienten Algorithmus zur Erkennung von Zyklen innerhalb eines gerichteten Graphen?

Ich habe einen gerichteten Graphen, der einen Zeitplan von auszuführenden Aufträgen darstellt, wobei ein Auftrag ein Knoten und eine Abhängigkeit eine Kante ist. Ich muss den Fehlerfall eines Zyklus innerhalb dieses Graphen erkennen, der zu zyklischen Abhängigkeiten führt.

21 Stimmen

Sie sagen, Sie wollen alle Zyklen erkennen, aber Ihr Anwendungsfall legt nahe, dass es ausreichen würde, zu erkennen, ob es irgendwelche Zyklen gibt.

38 Stimmen

Es wäre besser, alle Zyklen aufzuspüren, damit sie in einem Zug behoben werden können, als zu prüfen, zu beheben, zu prüfen, zu beheben usw.

2 Stimmen

Sie sollten die Arbeit "Finding all the elementary circuits of a directed graph" von Donald B. Johnson lesen. Es werden zwar nur elementare Schaltungen gefunden, aber das sollte für Ihren Fall ausreichen. Und hier ist meine Java-Implementierung dieses Algorithmus zur Verwendung bereit: github.com/1123/johnson

-1voto

mafonya Punkte 2046

Wenn DFS eine Kante findet, die auf einen bereits besuchten Knotenpunkt zeigt, gibt es dort einen Zyklus.

2 Stimmen

Scheitert an 1,2,3: 1,2; 1,3; 2,3;

0 Stimmen

@kittyPL können Sie erklären, warum dieser Fall nicht eintritt? Entweder 1) Es handelt sich um einen gerichteten Graphen und daher wurde kein Zyklus gebildet oder 2) DFS würde 1 -> 2 (mit 1,2), 2 -> 3 (mit 2,3), 3 -> 1 (mit 1,3) gehen

4 Stimmen

@JakeGreene Schau mal hier: i.imgur.com/tEkM5xy.png Einfach genug, um es zu verstehen. Nehmen wir an, du startest bei 0. Dann gehst du zum Knoten 1, von dort aus gibt es keine weiteren Pfade, die Regression geht zurück. Nun besucht man den Knoten 2, der eine Kante zum Knoten 1 hat, der bereits besucht wurde. Deiner Meinung nach hättest du dann einen Zyklus - und den hast du nicht wirklich

-13voto

Wenn ein Graph diese Eigenschaft erfüllt

|e| > |v| - 1

dann enthält der Graph mindestens einen Zyklus.

13 Stimmen

Das mag für ungerichtete Graphen zutreffen, aber sicher nicht für gerichtete Graphen.

7 Stimmen

Ein Gegenbeispiel wäre A->B, B->C, A->C.

0 Stimmen

Nicht alle Scheitelpunkte haben Kanten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X