Structures de données IFT-2000 Abder Alikacem La STL du C++ Semaine 5 Édition Septembre 2009 Département d’informatique et de génie logiciel
STL : Standard Template Library La STL est une bibliothèque de C++ qui permet de mettre en œuvre d’autres structures de données plus complexes et de faciliter également l’écriture de programmes. En quelques sortes, cette bibliothèque propose des algorithmes clés en main pour beaucoup de problèmes de programmation. Il s’agit d’une bibliothèque générique qui fournit des solutions pour gérer un ensemble de données en utilisant des algorithmes efficaces. Tous les composants de STL sont des templates
STL : Standard Template Library Conteneurs: En C++, une classe contenant un ensemble d’éléments d'un certain type est appelée conteneur. Ce sont donc eux qui contiendront les informations que l’on veut stocker. Itérateurs: utilisés pour parcourir les items qui se retrouvent dans les conteneurs, ils jouent un peu le rôle de pointeurs sur des éléments d’un conteneur. Algorithmes: utilisés pour faire des traitements sur les éléments qui se retrouvent dans les conteneurs.
Les conteneurs Les conteneurs sont classés suivant trois types: Séquentiels Adapteurs Associatifs Les conteneurs vector Tableau list Liste doublement chaînée slist List simplement chaînée deque Tableau avec des opération efficaces d’insertion et de suppression aux extrémités queue File- FIFO (first-in, first-out) stack Pile - LIFO (last in, first out) set Ensemble avec des éléments distincts map Table de hachage multiset Comme l’ensemble mais autorise des valeurs répétées multimap Comme la table de hachage mais autorise des clefs multiples
Conteneurs - Requis L’élément qui sera inclus dans un conteneur doit posséder: constructeur de recopie opérateur = destructeur un constructeur par défaut un test d’égalité (opérateur ==) un critère d’ordre (operateur < et autres)
Les itérateurs Un itérateur peut être vu comme un pointeur sur un élément d’un conteneur. Chaque conteneur fourni un type d’itérateur. Exemple le type list<int> donne un itérateur de type : list<int> :: iterator. Tous les conteneurs définissent deux types d’itérateur container::iterator //permet un accès en mode lecture/écriture container::const_iterator //mode lecture seulement
Les itérateurs Tous les conteneurs offrent les mêmes fonctions de base permettant aux itérateurs d’accéder aux éléments begin() Retourne un itérateur pointant au premier élément du conteneur end() Retourne un itérateur pointant après le dernier élément du conteneur
Les itérateurs Les principaux opérateurs sont * donnant accès à la valeur, ++ et -- pour incrémenter et décrémenter une valeur. Opérateur * : Retourne l’élément de la position courante Opérateur ++ : Fait pointer l’itérateur à l’élément suivant Opérateur == : Indique si 2 itérateurs pointent sur le même élément Opérateur = : Assigne un itérateur #include <list> #include <iostream> using namespace std; int main( ) { list <int> list1; for (int i = 1; i<=40; i++) list1.push_back(i+i); list <int> :: iterator i; for (i = list1.begin( ); i!=list1.end( ); i++) cout <<*i << “ “ ; return 0 ; }
Les itérateurs Exemple #include <list> // création d’une liste de caractères list<char> coll; for (char c = ‘a’; c<=‘z’; c++) coll.push_back(c); // impression de la liste à l’aide d’un itérateur list<char>::const_iterator pos; for(pos = coll.begin(); pos != coll.end(); pos++) cout << *pos << ‘ ‘;
Les algorithmes http://www.sgi.com/tech/stl/ La STL fournit un nombre important d’algorithmes génériques les plus utilisés, tels que les algorithmes de parcours, de recherche et de tri. Ils s’appliquent sur les conteneurs. Les algorithmes ne sont pas des fonctions membres des classes des conteneurs. Ce sont plutôt des fonctions globales qui opèrent avec des intérateurs. Pour manipuler cette bibliothèque, il suffit d‘incorporer dans l’entête #include <algorithtm> Description de la Standard Template Library du C++ http://www.sgi.com/tech/stl/
Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Édition Septembre 2009 Département d’informatique et de génie logiciel
Plan Introduction Nomenclature des graphes Matrice de connectivité Clôture transitive: algorithme de Warshall Plus court chemin: algorithme de Floyd 1 2 5 4 3
Les graphes Modélisent quoi au juste ? 1 2 5 4 3 cartes géographiques : réseaux routiers, de téléphonie, etc. trajets d’autobus, de trains, d’avions, de commis voyageurs circuits électriques, réseaux électriques Gestion d’une ville (transport, feux tricolore, voies à sens unique etc..) Etc..
Les graphes: définitions 2 Graphe (orienté) G = (S, A) S ensemble fini des sommets A Í S x S ensemble des arcs, i.e., relation sur S Graphe non orienté G = (S, A) A ensemble des arêtes, relation symétrique 4 1 5 3 S = { 1, 2, 3, 4, 5 } A = { (1, 2), (1, 3), (2, 3), (3, 2), (4, 4), (4, 5) } 2 4 1 3 S = { 1, 2, 3, 4 } A = { {1, 2}, {1, 3}, {1, 4}, {2, 4} }
Les graphes : définitions 1 2 5 4 3 Graphe G (S,A) S = {1,2,3,4,5}, A = {1-5,2-1,2-4,4-1,4-3,5-4} si 1-5 ≠ 5-1 alors g est orienté (digraphe) adjacence d’un nœud W si 1 arc V-W y est relié chemin suite d’arcs où le dernier d’une paire est le premier de la paire suivante (chemins simples) <2-4> et <2-1,1-5,5-4> = 2 chemins de 2 à 4 ordre d’un chemin nombre d’arcs le composant
Les graphes : définitions 1 2 5 4 3 ordre de sortie d’un nœud (arité de sortie) ordre d’entrée d’un nœud (arité d’entrée) = degré d’un sommet circuit chemin où l’origine est égale au dernier nœud ex. : <4-1,1-5,5-4> boucle circuit d’ordre 1 graphe acyclique graphe ne contenant aucun circuit puits nœud dont l’arité de sortie est 0 source nœud dont l’arité d’entrée est 0 nœud indépendant arité d’entrée = arité de sortie = 0
Les graphes : définitions 1 2 5 4 Graphe connexe : en oubliant le sens des flèches, un graphe est connexe s’il existe un chemin entre toutes paires de nœuds sinon : graphe à composantes connexes 3 1 2 5 4 3
Les graphes : définitions Graphe fortement connexe : en tenant compte du sens des flèches, un graphe est fortement connexe s’il existe un chemin entre toutes paires de nœuds Ce graphe comporte 5 composantes fortement connexes
Les graphes : définitions Points d’articulation : Cas d’un graphe non-orienté, Ce graphe est connexe, c'est-à-dire formé d'une seule composante. Ce graphe contient quatre points d'articulation, c'est-à-dire un sommet qui, s'il est éliminé, “ casse ” le graphe en deux ou plusieurs morceaux. Ces points d’articulation sont : A qui déconnecte B H qui déconnecte I J qui déconnecte K G qui produit 3 composantes. Un graphe qui ne possède pas de points d’articulation est appelé bi-connexe (ou 2-connexe)
Les graphes : définitions Graphe pondéré (valué) 1 0.8 1 2 sur 0.5 2 type-de 1 5 4 près 5 0.2 4 mange 1 0.75 à-côté saveur 3 3 à chaque arc valeur (numérique) à chaque arc valeur (nominale) Les graphes orientés et pondérés sont appelés des réseaux
Les graphes : définitions paillasson sur chat type-de mange près tapis lasagne à-côté saveur pepperoni Graphe pondéré : à chaque arc valeur (nominale) Graphe décoré (étiqueté) : à chaque nœud valeur
Opérations importantes Connectivité Existe-t-il un chemin entre V et W ? Quel est le chemin le plus court entre V et W ? avec chaque arc valeur de 1 ? avec un graphe pondéré ? Est-ce qu’un graphe g’ est inclus dans un autre graphe g ? Existe-t-il une couverture minimale pour g ? 1 2 1 5 4 2 5 4 3 3 1 2 1 2 5 4 5 4 3 3
Algorithmique des graphes Explorations Parcours en profondeur, en largeur Tri topologique Composantes fortement connexes, ... Recherche de chemins Clôture transitive (algorithme de Warshall) Chemin de coût minimal (algorithme de Floyd, Dijkstra, Bellman-Ford) ... Arbres recouvrants : Algorithmes de Kruskal et Prim Réseaux de transport Flot maximal (algorithme de Ford-Fulkerson) Divers Coloration d'un graphe
Les graphes (historique) Les ponts de Königsberg D A B C Problème : passer par tous les ponts une fois et une seule
Les graphes 3 5 C A D B IMPOSSIBLE ! Les ponts de Königsberg Un graphe connexe admet une chaîne eulérienne si et seulement si tous ses sommets sont de degré pair sauf éventuellement 2. Les ponts de Königsberg Un chemin dans un graphe est dit eulérien si et seulement si chaque arête faisant partie du chemin intervient une et une seule fois. 3 5 C A D B IMPOSSIBLE ! Problème : tracer les arcs de ce graphe sans lever le crayon
Implantation En général, il existe 2 manières pour mettre un graphe en mémoire: Par chaînage Listes des successeurs Dans une matrice Matrice de nœuds adjacents
Listes des successeurs Exemple S = { 1, 2, 3 } A = { (1,1), (1, 2), (1, 3), (2, 1), (3, 2)} 1 2 3 1 2 3 2 5 8 3 1 2 3 1 2 3 8 5
Matrices d’adjacences Exemple S = { 1, 2, 3 } A = { (1,1), (1, 2), (1, 3), (2, 1), (3, 2)} 0 1 1 M = 1 0 0 0 1 0 1 2 3 M [ i, j ] = 1 ssi j adjacent à i 0 8 5 3 0 2 0 1 V = 8 5 3 2 3 2
Opérations importantes Matrice d’adjacence 1 1 2 2 5 5 4 4 3 3 graphe orienté graphe non orienté 1 2 3 4 5 1 2 3 4 5 1 1 1 1 1 1 2 1 1 2 1 1 3 3 1 4 1 1 4 1 1 1 1 5 1 5 1 1
Opérations importantes 1 2 Matrice d’adjacence 5 4 3 1 2 3 4 5 1 2 3 4 5 1 1 1 1 1 2 1 1 2 1 1 2 3 3 4 1 1 4 1 1 2 5 1 5 1 1 2 1 2 1 arité de sortie arité d’entrée
Opérations importantes 1 2 Matrice d’adjacence 5 4 3 1 2 3 4 5 1 2 3 4 5 1 1 1 1 1 2 1 1 2 2 1 1 3 3 4 1 1 2 4 1 1 5 1 1 5 1 2 1 2 1 puits source
Opérations importantes Matrice d’adjacence 1 2 5 4 3 boucle 1 2 3 4 5 1 1 2 1 1 3 4 1 1 5 1
Opérations importantes Matrice d’adjacence 1 2 5 4 3 chemins de longueur 1 = A 1 2 3 4 5 1 1 2 1 1 3 4 1 1 5 1
Opérations importantes Matrice d’adjacence 1 2 5 4 3 chemins de longueur 2 ? 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1
Opérations importantes Matrice d’adjacence 1 2 5 4 3 chemins de longueur 2 ? 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 2 2 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 2 2 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 2 2 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 1 3 5
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 1 3 5 1
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 1 3 5 1
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 1 3 5 1 1
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 1 3 5 1 1
Chemins de longueur 2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 1 3 5 1 1
Chemins de longueur 2 = A2 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 1 3 5 1 1
Chemins de longueur 3 x 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 3 3 4 1 1 4 1 1 5 1 5 1 1 2 3 4 5 1 1 1 2 2 1 1 1 5 4 3 4 1 3 5 1 1
Chemins de longueur 3 = A3 1 2 3 4 5 1 2 3 4 5 1 1 1 1 2 1 1 2 1 1 1 3 3 4 1 1 4 1 5 1 5 1 1 1 2 3 4 5 1 1 1 1 2 2 1 1 5 4 3 4 1 3 5 1
Fermeture transitive des graphes Définition Soit G un graphe orienté de n noeuds. Soit A la matrice de nœuds adjacents correspondant. Complexité ? Soit Bn-1 = A + A2 + A3 … + An-1 Bn-1 P : matrice de booléens qui indique s’il existe un chemin entre toutes paires de nœuds la matrice P est appelée fermeture ou clôture transitive du graphe G (dans notre cas, on a une clôture par produits de matrices).
H : la fermeture transitive de A. Fermeture transitive des graphes Exemple graphe G graphe H 1 2 3 4 1 2 3 4 H : la fermeture transitive de A.
Algorithme deWarshall 1 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 2 P0 = 1 2 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 1 4 3 P1 = 1 2 4 3 0 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1 P2 = 4 1 3 2 0 1 1 1 0 1 1 1 1 1 1 1 P3 = 4 1 3 2 1 1 1 1 1 1 1 1 1 1 1 1 P4 = 4 3
Algorithme de Warshall {Soit A, un graphe orienté} 1. [Initialisation] P A 2. [Boucle sur tous les sommets intermédiaires] Pour k = 1, 2, ..., n répéter jusqu'à l'étape 4. 3. [Boucle sur les sommets de départ] Pour i = 1, 2, ..., n répéter l'étape 4. 4. [Boucle sur les sommets adjacents] Pour j = 1, 2, ..., n répéter Pij Pij ou (Pik et Pkj) 5. [Fin de l'algorithme] Stop Complexité ?
Algorithme de Floyd pour k = 1 à n faire pour i = 1 à n faire pour j = 1 à n faire C [i, j] ¬ MIN { C [i, j] , C [i, k] + C [k, j] } ; k j k c MIN { a, b + c } Ck = i b a i j a k b c
Floyd Warshall 1 2 4 3 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 C A L U M T R I E P 1 = P0 = P0 = 1 1 1 0 0 1 0 1 1 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 2 1 2 P1 = P1 = P 2 = 0 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 2 2 0 2 1 2 1 1 1 0 0 2 1 2 1 2 1 1 4 3 P2 = P2 = P 3 = 0 1 1 1 0 1 1 1 1 1 1 1 1 2 1 2 1 2 1 2 1 1 1 2 2 2 3 2 1 0 2 1 2 2 3 2 1 1 3 2 2 P3 = P3 = P 4 = 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 3 2 1 2 2 1 2 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 3 2 1 2 2 1 2 1 1 1 2 2 P4 = P4 = Floyd Warshall
Algorithme de Floyd Complexité ? Algorithme de Floyd {Soit A, un graphe orienté.} 1. [Initialisation] C A 2. [Boucle sur les sommets intermédiaires] Pour k = 1, 2, ..., n répéter jusqu'à l'étape 4. 3. [Boucle sur les sommets de départ] Pour i = 1, 2, ..., n répéter l'étape 4. 4. [Boucle sur les sommets adjacents] Pour j = 1, 2, ..., n répéter Cij MIN (Cij , Cik + Ckj) 5. [Fin de l'algorithme] Stop Complexité ?
Algorithme de Floyd et les distances 0 1 8 0 4 7 0 9 0 2 0 C0 = W = 1 9 2 4 7 8 1 2 0 1 8 0 4 7 0 9 0 1 0 C1 = 4 3 0 1 5 8 0 4 7 0 9 0 1 5 0 C2 = Matrice des poids : W [i,j] = 0 si i = j v((i,j)) si (i, j) A sinon 0 1 5 8 0 4 13 7 0 9 0 1 5 0 C3 = 0 1 5 8 13 0 4 13 9 7 0 9 0 1 5 0 C4 =
Algorithme de Floyd et les chemins 0 1 8 0 4 7 0 9 0 2 0 - 1 - 1 - - 2 - - 3 - 3 4 4 - - C0 = W = P0 = 1 9 2 4 7 8 1 2 0 1 8 0 4 7 0 9 0 1 0 - 1 - 1 - - 2 - - 3 - 3 4 1 - - C1 = P1 = 4 3 0 1 5 8 0 4 7 0 9 0 1 5 0 - 1 2 1 - - 2 - - 3 - 3 4 1 2 - C2 = P2 = Matrice des prédécesseurs Pk [i, j] = prédécesseur de j sur un plus court chemin de i à j dont les sommets intermédiaires sont tous k 0 1 5 8 0 4 13 7 0 9 0 1 5 0 - 1 2 1 - - 2 3 - 3 - 3 4 1 2 - C3 = P3 = 0 1 5 8 13 0 4 13 9 7 0 9 0 1 5 0 - 1 2 1 4 - 2 3 4 3 - 3 4 1 2 - C4 = P4 =
Algorithme de Floyd 1 2 4 3 0 1 5 8 13 0 4 13 9 7 0 9 7 8 1 2 0 1 5 8 13 0 4 13 9 7 0 9 0 1 5 0 - 1 2 1 4 - 2 3 4 3 - 3 0 1 2 - C4 = P4 = 4 3 Exemple de chemin distance de 2 à 1 = C4[2,1] = 13 P4[2,1] = 4 ; P4[2,4] = 3 ; P4[2,3] = 2 ; 2 3 4 9 1