title: Algorithme de Warshall
text: # Algorithme de Warshall
  
  L'algorithme de Warshall, parfois appelé algorithme de Roy-Warshall est un algorithme agissant sur un graphe. Il permet de construire la fermeture transitive d'un graphe orienté ou non orienté, c'est-à-dire de construire un deuxième graphe sur le même ensemble de sommet, avec un arc d'un sommet u à un sommet v, si et seulement si il existe un chemin dans le graphe original de u à v. Cet algorithme donne donc des informations sur les composantes connexes ou fortement connexes d'un graphe.
  
  ## Historique
  
  L'algorithme doit son nom à Stephen Warshall qui l'a publié en 1962, et il a été décrit également par Bernard Roy en 1959. Robert W. Floyd a publié dans les Communications of the ACM l'algorithme en quatre lignes (Algorithm 96) en même temps que son algorithme de calcul des plus courts chemins (Algorithm 97) connu sous le nom d'algorithme de Floyd-Warshall.
  
  ## Principe
  
  À partir de la matrice d'adjacence C d'un graphe G, l'algorithme calcule la matrice d'adjacence $C^*$ de la fermeture transitive du graphe. Les sommets du graphe sont numérotés de 1 à n.
  
  L'algorithme calcule une suite de matrices $C_k$ de matrices, pour k=0, etc.,n. La matrice $C_0$ est la matrice C de départ, la matrice $C_n$ est la matrice $C^*$ cherchée. Les matrices $C_k$ vérifient la propriété que $C_k[i,j]=1$ s'il existe un chemin de i à j passant uniquement par des sommets inférieurs ou égaux à k, et 0 dans le cas contraire.
  
  Cette propriété caractéristique est bien vérifiée pour k=0 et pour k=n. Pour construire la matrice $C_k,$ on observe qu'il existe un chemin de i à j passant seulement par des sommets inférieurs ou égaux à k si et seulement s'il existe un chemin de i à j ne passant que par des sommets inférieurs ou égaux à k-1 ou alors s'il existe un chemin de i à k passant par des sommets inférieurs ou égaux à k-1 et un chemin de k à j passant par des sommets inférieurs ou égaux à k-1. Ce que l'on peut formuler par :
  
      $C_{k}[i,j]=C_{k-1}[i,j]\lor (C_{k-1}[i,k]\land C_{k-1}[k,j])$.
  
  Ce principe est aussi utilisé dans l'algorithme de Floyd-Warshall.
  
  ## Algorithme
  
  On peut écrire l'algorithme en pseudo-code comme suit (ici C est la matrice associée du graphe) :
  
  On peut optimiser l'algorithme en effectuant le calcul en place dans une unique matrice C. Le pseudo-code suivant effectue ce calcul :
  
  L'expression booléenne se réécrit avec des conditionnelles comme suit :
  
  Ceci est exactement la formulation de l'algorithme publiée dans les communications de l'ACM.
  
  Exemple de fonction programmée en C qui, pour la matrice binaire d'adjacence C du graphe G donnée, calcule la matrice d'adjacence A de $G^*.$
  
  ## Complexité
  
  La construction de la fermeture transitive par l'algorithme de Warshall a une complexité en $\Theta (n^{3})$. Cela dit, il peut être intéressant de construire la fermeture transitive d'un graphe une fois pour toutes ; ainsi, on peut savoir par simple inspection si les sommets i et j appartiennent à la même composante connexe en un temps constant (réservé aux systèmes statiques).
  
  