• Aucun résultat trouvé

Une autre application de la structure tas (cas de Dijkstra)

Dans le document Notes de programmation (C) et d'algorithmique (Page 172-176)

Dijks-tra)

On va analyser la complexit´e de l’algorithme de Dijkstra dans le cas o`u on utilise la structure tas (chapitre 14).

— On maintient un tas. Chaque ´el´ement du tas est compos´e de : (i) un noeud, (ii) une estimation de sa distance de la racine, (iii) une estimation du noeud pr´ed´ecesseur. — Notez qu’`a partir d’une table de pr´ed´ecesseurs il est facile de construire les listes

d’adjacence qui repr´esentent l’arbre des PCC.

— Les ´el´ements du tas sont ordonn´es par ordre croissant par rapport `a la distance (on a donc un min-tas).

— On maintient aussi un tableau T avec autant d’´el´ements que de noeuds. Chaque ´el´ement contient un pointeur `a la position du noeud dans le tas (donc chaque modification de la position d’un ´el´ement dans le tas doit ˆetre enregistr´ee dans le tableau).

Remarque 33 Le tas contient des noeuds pas des arˆetes !

Complexit´e de l’algorithme de Dijkstra Avec ces structures de donn´ees on peut en O(log n) :

— Extraire le min du tas.

— Mettre `a jour (diminuer) l’estimation de la distance d’un ´el´ement du tas et de son pr´ed´ecesseur. Ceci est possible car le tableau T nous donne un acc`es direct `a la posi-tion de l’´el´ement dans le tas et ensuite il suffit de permuter avec le p`ere autant que n´ecessaire.

Avec un peu de travail, on obtient une complexit´e O(m log n).

Chapitre 25

Flot maximum et coupe minimale

On peut voir un graphe comme un r´eseau de transport et les pond´erations des arˆetes comme une mesure de la capacit´e de transport de chaque arˆete. Si on fixe un noeud ‘source’ et un noeud ‘destination’ une question naturelle est celle de maximiser la quantit´e que l’on peut transporter de l’origine `a la destination. En termes plus techniques, on consid`ere le probl`eme de maximiser le flot (d´efinition `a suivre) dans un graphe dont les arˆetes ont des capacit´es born´ees (probl`eme MaxFlot).

Il se trouve que ce probl`eme admet un probl`eme dual qui consiste `a rechercher une coupe minimale du graphe. Cette notion de coupe minimale est aussi facile `a motiver. Par exemple, si toutes les capacit´es des arˆetes sont identiques, une coupe minimale du graphe consiste `a d´eterminer le nombre minimum d’arˆetes qu’il faut couper pour disconnecter le noeud source du noeud destination. On a ici un premier exemple de dualit´e en optimisation combinatoire. Typiquement cette dualit´e prend la forme suivante : un probl`eme de maximisation admet un probl`eme dual de minimisation tel que les solutions des deux probl`emes, si elles existent, alors elles co¨ıncident. En particulier, dans ce chapitre on montrera que le flot maximum co¨ıncide avec la coupe minimale [FF56].

Ce r´esultat de dualit´e coupl´e avec la notion de chemin augmentant est la base pour la conception d’algorithmes efficaces (polynomiaux) pour le probl`eme MaxFlot. Le probl`eme MaxFlot est aussi int´eressant pour d’autres raisons.

— Le probl`eme peut ˆetre formalis´e comme un probl`eme de programmation lin´eaire (cha-pitre 26) `a savoir un probl`eme de maximisation d’une fonction lin´eaire sujette `a des contraintes lin´eaires.

— Quand les capacit´es sont des entiers, le probl`eme MaxFlot peut aussi ˆetre vu comme un probl`eme de programmation enti`ere, `a savoir un probl`eme de programmation lin´eaire o`u en plus on demande `a que les solutions soient des entiers. Dans ce contexte, le probl`eme MaxFlot a la propri´et´e remarquable que le maximum du probl`eme de pro-grammation lin´eaire co¨ıncide avec le maximum du probl`eme de programmation enti`ere.

25.1 Flots et coupes

D´efinition 29 (capacit´e) Soit N un ensemble fini (de noeuds). Une capacit´e est une fonc-tion c : N2 → R+ qui associe un nombre non n´egatif `a chaque couple de noeuds.

Une capacit´e est une fonction. Par extension, on parlera aussi de capacit´e d’une arˆete et

dans ce cas il s’agira d’un nombre r´e´el positif. Si on prend comme ensemble des arˆetes : A = {(i, j) ∈ N2| c(i, j) > 0} ,

on obtient un graphe dirig´e et pond´er´e (voir chapitre 24).1 Par exemple, si une arˆete mod´elise un tuyau alors la capacit´e peut correspondre au nombre de litres par second qui peuvent transiter dans le tuyau. Pour d’autres exemples, on peut s’inspirer des r´eseaux ´electriques ou routiers.

On distingue deux noeuds diff´erents s (source) et d (destination) et on s’int´eresse `a la question de trouver le ‘flot’ maximal de s `a d que le r´eseau peut supporter.

D´efinition 30 (flot) Un flot est une fonction f : N2 → R qui satisfait les 3 conditions suivantes :2

sym´etrie ∀i, j ∈ N (f (i, j) = −f (j, i)). conservation ∀i ∈ N \{s, d} Σj∈N f (i, j) = 0. capacit´e ∀i, j ∈ N (f (i, j) ≤ c(i, j)).

L’intuition est que f (i, j) d´ecrit la quantit´e de flot net qui peut aller de i `a j. La premi`ere condition exprime le fait que le flot de i `a j doit ˆetre l’oppos´e du flot de j `a i. Cette condition implique qu’on a toujours f (i, i) = 0. La deuxi`eme condition est un principe de conservation du flot : dans tous les noeuds sauf s et d le flot ‘entrant’ doit ˆetre ´egal au flot ‘sortant’. Enfin la troisi`eme condition impose un flot compatible avec la capacit´e de l’arˆete. En particulier : (i) si c(i, j) = c(j, i) = 0 alors on doit avoir f (i, j) = f (j, i) = 0 et (ii) si f (i, j) < 0 alors |f (i, j)| ≤ c(i, j) (le flot n´egatif est aussi born´e).

Exemple 64 Supposons un graphe avec deux noeuds et les capacit´es (non nulles) suivantes : c(s, d) = 4 et c(d, s) = 2. Alors tout flot doit satisfaire f (d, d) = f (s, s) = 0. Par ailleurs, si on pose f (s, d) = 2 alors on doit avoir f (d, s) = −2 ce qui est compatible avec les capacit´es. On peut remarquer qu’il existe plusieurs fa¸cons de ‘r´ealiser’ concr`etement ce flot net. A savoir, s envoie x `a d pour 2 ≤ x ≤ 4 et d envoie (x − 2) `a s.

D´efinition 31 (coupe) Une coupe est une partition de l’ensemble de noeuds N en deux ensembles A et B tels que s ∈ A et d ∈ B.

D´efinition 32 (capacit´e d’une coupe) La capacit´e c(A, B) d’une coupe (A, B) est : c(A, B) = Σi∈A,j∈B c(i, j)

De fa¸con similaire, si f est un flot on pose f (A, B) = Σi∈A,j∈B f (i, j). Il se trouve que cette quantit´e depend du flot mais pas de la coupe.

Proposition 28 Soit f un flot. Alors :

1. la valeur f (A, B) est constante (ne depend pas du choix de la coupe). 2. f (A, B) ≤ c(A, B).

1. On remarquera qu’on retient dans A seulement les couples avec capacit´e strictement positive.

2. On retrouve ces mˆemes conditions dans d’autres contextes ; par exemple dans l’´etude de circuits ´

Flot maximum et coupe minimale 175

Preuve. (1) On pose :

|f | = f ({s}, N \{s}) .

On montre que pour toute coupe (A, B), f (A, B) = |f |. On proc`ede par r´ecurrence sur ]A. Le cas ]A = 1 suit de la d´efinition de |f |. Sinon soit (A, B) une coupe avec A = A0 ∪ {i} et i 6= s. Par hypoth`ese de r´ecurrence, on sait :

|f | = f (A0, B ∪ {i}) = f (A0, B) + f (A0, {i}) .

D’autre part, f (A, B) = f (A0, B) + f ({i}, B). Par sym´etrie, f (A0, {i}) = −f ({i}, A0) et par conservation, f ({i}, A0) + f ({i}, B) = 0. Donc f (A0, {i}) = f ({i}, B) et on peut conclure que |f | = f (A, B).

(2) Par la condition sur la capacit´e. 2

On peut donc d´efinir la valeur |f | d’un flot comme le flot f (A, B) par rapport `a une coupe (A, B) quelconque.

|f | = f (A, B) (A, B) coupe (25.1)

D´efinition 33 (probl`eme flot maximum) Le probl`eme du flot maximum est le probl`eme de d´eterminer pour toute capacit´e donn´ee c : N2→ R+, un flot de valeur maximale.

D´efinition 34 (probl`eme coupe minimale) Le probl`eme de la coupe minimale est le probl`eme de trouver pour toute capacit´e donn´ee c : N2→ R+, une coupe de capacit´e minimale.

Dans le document Notes de programmation (C) et d'algorithmique (Page 172-176)