pseudocode voor het vinden gesloten paden in een grafiek

stemmen
-1

Ik heb een adjaceny matrix een grafiek die de randen tussen de knooppunten sporen door een 1 in de overeenkomstige adjMat [i, j] = 1; Hierdoor adjaceny matrix i wilt weten alle gesloten paden van lengte 4, die in de grafiek bestaat. Kan iemand mij voorzien van een pseudo-code. dank u

De vraag is gesteld op 14/03/2009 om 20:38
bron van user
In andere talen...                            


3 antwoorden

stemmen
0

Breng een grondige beperkte diepte-eerst zoeken naar elk knooppunt en opnemen knooppunten waar de DFS vindt de start knooppunt. Voor het zoeken, zie pseudo-code hier: http://en.wikipedia.org/wiki/Depth-limited_search . Je hoeft alleen maar om zoiets toe te voegen

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

naar het begin van de lus.

antwoordde op 14/03/2009 om 20:56
bron van user

stemmen
2

Dit klinkt als huiswerk, dus ik zal de hele zaak niet weggeven. Maar hier is een hint: omdat je geïnteresseerd bent in het vinden van cycli met een lengte van 4 zijn, neemt u de 4e macht van de adjacentiematrix en scan langs de diagonaal. Als een item M [i, i] niet nul is, is een cyclus met hoekpunt i.

antwoordde op 14/03/2009 om 20:57
bron van user

stemmen
1

Misschien is het niet de optimale manier om het (het is te berekenen O(n^4)), maar een zeer eenvoudige manier wordt gescand door de alle hoekpunten

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

U kunt dan controleren of elk van de volgende cycli:

 1. ([a, b] && [b, c] && [cd] && [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

Je bent in principe controle van elke geordende verzameling van hoekpunten (a, b, c, d) voor de 3 manieren waarop ze een cyclus kunnen vormen.

Dus de pseudo-code zou zijn:

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
antwoordde op 14/03/2009 om 21:15
bron van user

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