J'ai une matrice de adjaceny pour un graphe qui suit les bords entre les noeuds en ayant un 1 dans le adjMat correspondant [i, j] = 1; A travers cette matrice adjaceny je veux savoir tous les chemins fermés de longueur 4 qui existe dans le graphique. Quelqu'un peut-il s'il vous plaît me donner un code pseudo. Merci
pseudo-code pour trouver des chemins fermés dans un graphique
Appliquer une profondeur de première recherche limitée en profondeur à tous les noeuds de noeud et d' enregistrement où le DFS trouve le nœud de départ. Pour la recherche, voir pseudo-code ici: http://en.wikipedia.org/wiki/Depth-limited_search . Vous avez juste besoin d'ajouter quelque chose comme
if(node' == node && node'.depth==4) memorize(node)
au début de la boucle.
Cela sonne comme devoirs, je ne vais pas donner toute la chose. Mais voici une astuce: puisque vous êtes intéressé à trouver des cycles de longueur 4, prendre la puissance 4 de la matrice de contiguïté et de scanner le long de la diagonale. Si une entrée M [i, i] est différent de zéro, il y a un sommet contenant du cycle i.
Peut-être que ce n'est pas la meilleure façon de le calculer (il est O(n^4)), mais d' une manière très simple est de scanner à travers les tous les sommets
a, b, c, d such that b > a, c > b, d > c
Vous pouvez vérifier ensuite vérifier chacun des cycles suivants:
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
Vous vérifier essentiellement tous ensemble de sommets (a, b, c, d) pour les 3 façons dont ils pourraient former un cycle.
Ainsi, le code pseudo serait:
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













