silico.biotoul.fr
 

M1 MABS Graphes TP Parcours en largeur - Plus court chemin

From silico.biotoul.fr

Revision as of 09:29, 20 February 2013 by Barriot (Talk | contribs)
(diff) ← Older revision | Current revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Parcours en profondeur

Algorithme :

BFS(graphe g, sommet s)
   f = créerFile
   marquer(s)
   enfiler(f,s)
   tant que f n'est pas vide
      x = défiler(f)
      afficher(x)
      pour chaque successeur de x faire
         si successeur n'est pas marqué alors
            marquer(successeur)
            enfiler(f, successeur)



Plus court chemin - Dijkstra

Pour l'algorithme suivant,

  • D[x] donne la plus courte distance entre s et x. Au départ, D[s]=0 et D[x]=infini pour tout x différent s.
  • P[x] est le prédécesseur de x dans le chemin de plus courte distance allant de s à x. Au départ, P[x]=rien pour tout x.
  • C est l'ensemble de sommets qu'il reste à parcourir. Au départ, C=V (V étant l'ensemble des sommets du graphe).
  • W[x,y] est la valuation de l'arc (x,y)

Algorithme :

Dijkstra(graphe g, sommet s)
   initialiser D, P et C
   tant que C n'est pas vide faire
      x = extraire le sommet le plus proche de C
      pour chaque successeur de x faire
         si D[x] + W[x,successeur] < D[successeur] alors 
            D[successeur] = D[x] + D[successeur]
            P[successeur] = x


Plus courts chemins - Floyd-Warshall

Pour l'agorithme suivant,

  • D[x,y] est la distance du plus court chemin entre les sommets x et y
  • N[x,y] est le successeur de x dans le plus court chemin allant de x à y
  • W[x,y] est la valuation de l'arc (x,y)

Algorithme :

initialiser D = W, et N
pour k de 1 à n
   pour i de 1 à n
      pour j de 1 à n
         si D[i,k] + D[k,j] < D[i,j] alors
            D[i,j] = D[i,k] + D[k,j]
            N[i,j] = k

Récupération du plus court chemin à partir de la matrice N :

plusCourtChemin(D,N, i,j)
   si D[i,j] est infinie alors
      il n'y a pas de chemin entre i et j
   chemin = initialiserChemin(i)
   k = N[i,j]
   tant que k est défini faire
      ajouter(chemin, k)
      k = N[k,j]
   ajouter(chemin, j)