pseudo codice per reperire tracciati chiusi in un grafico

voti
-1

Ho una matrice adjaceny per un grafico che traccia i bordi tra i nodi avendo un 1 nella corrispondente adjMat [i, j] = 1; Attraverso questa matrice adjaceny desidero scoprire tutti i percorsi chiusi di lunghezza 4 che esiste nel grafico. Qualcuno può fornirmi una pseudo codice. grazie

È pubblicato 14/03/2009 alle 20:38
fonte dall'utente
In altre lingue...                            


3 risposte

voti
0

Applicare una profondità limitata profondità prima di ricerca per ogni nodo e registrare i nodi in cui la DFS ritrova il nodo di partenza. Per la ricerca, vedere pseudo-codice qui: http://en.wikipedia.org/wiki/Depth-limited_search . Hai solo bisogno di aggiungere qualcosa di simile

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

all'inizio del ciclo.

Risposto il 14/03/2009 a 20:56
fonte dall'utente

voti
2

Questo suona come compiti a casa, quindi non darà il tutto via. Ma ecco un suggerimento: visto che siete interessati a trovare cicli di lunghezza 4, prendere la quarta potenza della matrice di adiacenza e la scansione lungo la diagonale. Se qualsiasi voce M [i, i] è diverso da zero, c'è un ciclo contenente vertice i.

Risposto il 14/03/2009 a 20:57
fonte dall'utente

voti
1

Forse non è il modo ottimale per calcolarlo (è O(n^4)), ma un modo molto semplice è scansione attraverso i tutti i vertici

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

È possibile controllare quindi controllare per ognuno dei seguenti cicli:

 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 --- A --- B BAB
 | | \ / | \ / |
 | | X | X |
 | | / \ | / \ |
 D --- --- C D CCD

Stai fondamentalmente controllando ogni serie ordinata di vertici (a, b, c, d) per i 3 modi che avrebbero potuto formare un ciclo.

Così la pseudo codice sarebbe:

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
Risposto il 14/03/2009 a 21:15
fonte dall'utente

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