Pseudo-Code für geschlossene Pfade in einem Graphen zu finden,

stimmen
-1

Ich habe eine adjaceny Matrix für eine Kurve, die die Ränder zwischen den Knoten Spuren durch ein 1 in der entsprechenden adjMat mit [i, j] = 1; Durch diese adjaceny Matrix möchte ich die geschlossenen Bahnen aller Länge, um herauszufinden, 4, die in der Grafik vorhanden ist. Kann mich mit einem Pseudo-Code liefert jemand bitte. Danke

Veröffentlicht am 14/03/2009 um 20:38
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Tragen Sie eine Tiefe begrenzte depth-first-Suche auf jedem Knoten und Aufzeichnung Knoten , an denen die DFS den Startknoten findet. Für die Suche finden Sie Pseudocode hier: http://en.wikipedia.org/wiki/Depth-limited_search . Sie müssen nur etwas hinzufügen wie

if(node' == node && node'.depth==4) memorize(node)

zum Anfang der Schleife.

Beantwortet am 14/03/2009 um 20:56
quelle vom benutzer

stimmen
2

Das klingt wie Hausaufgaben, also werde ich das Ganze nicht verraten. Aber hier ist ein Hinweis: Da Sie bei der Suche nach Zyklen der Länge 4 interessiert sind, nehmen Sie die 4. Potenz der Adjazenzmatrix und Scannen entlang der Diagonalen. Wenn irgendein Eintrag M [i, i] ungleich Null ist, gibt es einen Zyklus enthält Knoten i.

Beantwortet am 14/03/2009 um 20:57
quelle vom benutzer

stimmen
1

Vielleicht ist es nicht der optimale Weg , es zu berechnen , (es ist O(n^4)), aber eine sehr einfache Art und Weise wird durch der alle Ecken scannen

a, b, c, d such that b > a, c > b, d > c

Sie können dann für jede der folgenden Zyklen überprüfen überprüfen:

 1. ([a, b] && [b, c] && [c, d] && [d, a])
 2. ([a, b] && [b, d] && [d, c] && [c, a]) 
 3. ([a, d] && [d, b] && [b, c] && [c, a])

 1: 2: 3:
 A --- B --- A BAB
 | | \ / | \ / |
 | | X | X |
 | | / \ | / \ |
 D --- --- C D CCD

Sie sind im Grunde jede geordnete Menge von Eckpunkten (a, b, c, d) für die 3 Möglichkeiten überprüft, dass sie einen Zyklus bilden könnten.

So ist der Pseudo-Code wäre:

for a = 0 to <lastVertex>
 for b = a + 1 to <lastVertex>
  for c = b + 1 to <lastVertex>
   for d = c + 1 to <lastVertex>

    if(IsCycle(a,b,c,d)) AddToList([a,b,c,d])
    if(IsCycle(a,b,d,c)) AddToList([a,b,d,c])
    if(IsCycle(a,c,b,d)) AddToList([a,c,b,d])

   next d
  next c
 next b    
next a
Beantwortet am 14/03/2009 um 21:15
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more