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
pseudo codice per reperire tracciati chiusi in un grafico
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.
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.
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













