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
pseudocode voor het vinden gesloten paden in een grafiek
bron van user N3tsecure
In andere talen...
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.
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.
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