Top Qs
Chronologie
Chat
Contexte
Algorithme de Warshall
De Wikipédia, l'encyclopédie libre
Remove ads
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.
Remove ads
Historique
L'algorithme doit son nom à Stephen Warshall qui l'a publié en 1962[1], et il a été décrit également par Bernard Roy en 1959[2]. Robert W. Floyd[3] 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[4].
Principe
Résumé
Contexte
À 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[5]. Les sommets du graphe sont numérotés de 1 à n.
L'algorithme calcule une suite de matrices Ck de matrices, pour k=0, etc.,n. La matrice C0 est la matrice C de départ, la matrice Cn est la matrice C* cherchée. Les matrices Ck vérifient la propriété que Ck[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 Ck, 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 :
- .
Ce principe est aussi utilisé dans l'algorithme de Floyd-Warshall.
Remove ads
Algorithme
Résumé
Contexte
On peut écrire l'algorithme en pseudo-code comme suit (ici C est la matrice associée du graphe) :
Roy-Warshall (C) C0 = C pour k de 1 à n pour i de 1 à n pour j de 1 à n Ck[i,j] = Ck-1[i,j] or (Ck-1[i,k] and Ck-1[k,j]) retourner Cn
On peut optimiser l'algorithme en effectuant le calcul en place dans une unique matrice C. Le pseudo-code suivant effectue ce calcul :
Roy-Warshall (C) pour k de 1 à n pour i de 1 à n pour j de 1 à n C[i,j] = C[i,j] or (C[i,k] and C[k,j]) retourner C
L'expression booléenne se réécrit avec des conditionnelles comme suit :
Roy-Warshall (C) pour k de 1 à n pour i de 1 à n si C[i,k] alors pour j de 1 à n si C[k,j] alors C[i,j] = true retourner C
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*.
typedef _Bool MatAdj[n][n]; // où n est le nombre de sommets de G void Warshall(MatAdj C, // la matrice d'adjacence de G MatAdj A) // la matrice d'adjacence de G* { int i, j, k; for(i = 0; i < n; i++) for(j = 0; j < n; j++) A[i][j] = C[i][j]; for(k = 0; k < n; k++) for(i = 0; i < n; i++) for(j = 0; j < n; j++) A[i][j] = A[i][j] || (A[i][k] && A[k][j]); }
Complexité
La construction de la fermeture transitive par l'algorithme de Warshall a une complexité en . 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).
Remove ads
Notes et références
Voir aussi
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads