pseudo código para encontrar caminos cerrados en un gráfico

votos
-1

Tengo una matriz adjaceny para un gráfico que rastrea los bordes entre los nodos al tener un 1 en el adjMat correspondiente [i, j] = 1; A través de esta matriz adjaceny deseo conocer todos los caminos cerrados de longitud 4 que existen en el gráfico. ¿Alguien puede darme un pseudo código? Gracias

Publicado el 14/03/2009 a las 20:38
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

Aplique una búsqueda en profundidad con profundidad limitada a cada nodo y anote los nodos donde el DFS encuentre el nodo de inicio. Para la búsqueda, consulte el pseudocódigo aquí: http://en.wikipedia.org/wiki/Depth-limited_search . Solo necesitas agregar algo como

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

al comienzo del ciclo

Respondida el 14/03/2009 a las 20:56
fuente por usuario

votos
2

Esto suena como tarea, así que no voy a dar todo el asunto. Pero aquí hay una pista: dado que está interesado en encontrar ciclos de longitud 4, tome la cuarta potencia de la matriz de adyacencia y escanee a lo largo de la diagonal. Si cualquier entrada M [i, i] es distinta de cero, hay un ciclo que contiene el vértice i.

Respondida el 14/03/2009 a las 20:57
fuente por usuario

votos
1

Tal vez no es la forma óptima de calcularlo (es O(n^4)), pero una forma muy sencilla es escanear todos los vértices

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

Puede verificar y verificar cada uno de los siguientes ciclos:

 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

Básicamente, estás comprobando cada conjunto ordenado de vértices (a, b, c, d) para las 3 formas en que podrían formar un ciclo.

Entonces el pseudo código sería:

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
Respondida el 14/03/2009 a las 21:15
fuente por usuario

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