![]() |
Zyklen in ungerichteten Graphen
Hallo DP,
die "einfache" Frage: Wie finde ich alle Zyklen in einem ungerichteten Graphen? Ich habe mich bis jetzt ziemlich dämlich dabei angestellt, da ich vermutlich meine Gedanken nicht geordnet kriege :roll: Überlegt habe ich mir, dass ich eine Breitensuche nutze um einen Zyklus (ausgehend von Knoten A) zu finden, doch hierbei scheitert es an der "Markierung" für bereits besuchte Knoten:
Code:
In der dritten Rekursion käme es ja zu einem Fehler, da der Weg D und E ja schon besucht wurden - jedoch müsste es die Wege E -> D sowie D -> E noch geben (+ den weiteren Weg zu A).
A <- 1. Rekursion
/ \ B C <- 2. Rekursion | | D---E <- 3. Rekursion Wie könnte ich einer Breitensuche also vermitteln, dass (z.B.) der Knoten E für D erreichber ist? Hoffe ich konnte mich verständlich ausdrücken, wenn etwas unklar ist (oder jemand mir sogar weiterhelfen kann :stupid:) würde ich weitere Infos liefern. In Quelltext habe ich mich erst gar nicht heran gewagt, da mir die Vorüberlegungen schon Kopfschmerzen bereiten :oops: |
AW: Zyklen in ungerichteten Graphen
Führe eine Tiefensuche durch und markiere bereits besuchte Knoten.
Hier mal Pseudocode:
Delphi-Quellcode:
Dabei wird jeder zyklische Pfad, der länger als 'MinLength' ist, ausgegeben (glaube ich).
Procedure Cycle (Path : TPath; Graph : TGraph)
Begin Foreach node in Graph.NeighborOf(Path.Last) if (node=Path.First) and (Path.Length>MinLength) then Show(Path+node) else if Not node.visited then begin node.visited := True; Cylce(Path+node,Graph); node.visited := False; end end; |
AW: Zyklen in ungerichteten Graphen
Beim Googeln findet man eine Menge, unter anderem
![]() |
AW: Zyklen in ungerichteten Graphen
Liste der Anhänge anzeigen (Anzahl: 1)
@Furchtbichler - sofern ich mich grad nicht vertue, dürfte der Code nen kleinen Fehler enthalten (obwohls ja nur Pseudocode ist..) - und zwar merkst du nicht wirklich, welche Knoten bereits besucht sind (bzw. du überprüfst nicht, ob der Knoten bereits besucht wurde), somit kann der Fall auftreten, dass Cycle nie aufhört -> z.B. hier:
A->B->C->D->B Edit2: Sonst sollte es aber nach diesem Prinzip gehen! Einfach eine kleine Überprüfung einbauen, ob man an einem Knoten angelangt ist, der bereits im "Path" enthalten ist, jedoch nicht der "First" Knoten ist! Hier dann abbrechen, da ja der Startknoten dann nicht im Zyklus enthalten ist sondern nur dorthin führt.. @Threadstarter - es gibt da eine Unklarheit: Willst du alle Zyklen die einen bestimmten Knoten (A) enthalten oder willst du alle Zyklen, wo kein Element eines Zyklus' in einem anderen Zyklus vorkommt?! Ich bin mir nicht ganz sicher, aber die Implementierung dürfte je nach dem anders aussehen. Bevor ich mir also Gedanken mache, wäre es schön, wenn du das klärst! Edit: Da ich grad Zeit habe, habe ich das mal schnell gezeichnet :P |
AW: Zyklen in ungerichteten Graphen
Zitat:
|
AW: Zyklen in ungerichteten Graphen
Hmm ok, stimmt, hab das mit "visited" nicht bedacht. Bin bei der ersten If Condition stehen geblieben und zu dem Entschluss gekommen..
|
AW: Zyklen in ungerichteten Graphen
Entschuldigt die lange Wartezeit :roll:
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz