pseudo-code pour trouver des chemins fermés dans un graphique

voix
-1

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

Créé 14/03/2009 à 20:38
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

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.

Créé 14/03/2009 à 20:56
source utilisateur

voix
2

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.

Créé 14/03/2009 à 20:57
source utilisateur

voix
1

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
Créé 14/03/2009 à 21:15
source utilisateur

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