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
pseudo código para encontrar caminos cerrados en un gráfico
fuente por usuario N3tsecure
En otros idiomas...
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
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.
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