Algorithmique avanc´ ee
L3 Informatique Etienne Birmel´e
I. Introduction : Notion de graphe
Notion de graphe
Graphe
UngrapheGest un couple(V,E)o`uV est l’ensemble des sommets et E⊂V ×V est l’ensemble des arˆetes.
Il est repr´esent´e graphiquement par un ensemble de points (les sommets) reli´es par des segments (les arˆetes).
v1
v2
v3
v4
v5
v6
v7
v8
Notion de graphe
I Le graphe est l’objet math´ematique permettant de d´ecrire des interactions entre sujets.
I Applications aussi diverses que l’informatique, les t´el´ecommunications, la sociologie ou la biologie.
I Principe : traduire le probl`eme pos´e en un probl`eme d’algorithmique `a r´esoudre sur des graphes.
Exemples :
I Attribution de fr´equences `a des ´emetteurs : deux ´emetteurs trop proches et non s´epar´es par un obstacle naturel ne peuvent recevoir le mˆeme
fr´equence. Le probl`eme devient un probl`eme de coloration de graphes.
I GPS : recherche de chemins les plus courts dans un graphe avec des poids sur les arˆetes.
Types de graphes
Suivant le type de probl`eme que l’on cherche `a r´esoudre, on peut consid´erer des graphes
I non-orient´eouorient´e.
I avec ou sansboucle
I simpleou avec desarˆetes multiples
I color´es(sommets ou arˆetes)
I valu´es(sommets ou arˆetes)
v1
v2
v3
v4 v1
v2
v3
v4
Types de graphes
Suivant le type de probl`eme que l’on cherche `a r´esoudre, on peut consid´erer des graphes
I non-orient´eouorient´e.
I avec ou sansboucle
I simpleou avec desarˆetes multiples
I color´es(sommets ou arˆetes)
I valu´es(sommets ou arˆetes)
v1
v2
v3
v4 v1
v2
v3
v4
Types de graphes
Suivant le type de probl`eme que l’on cherche `a r´esoudre, on peut consid´erer des graphes
I non-orient´eouorient´e.
I avec ou sansboucle
I simpleou avec desarˆetes multiples
I color´es(sommets ou arˆetes)
I valu´es(sommets ou arˆetes)
v1
v2
v3
v4 v1
v2
v3
v4
Types de graphes
Suivant le type de probl`eme que l’on cherche `a r´esoudre, on peut consid´erer des graphes
I non-orient´eouorient´e.
I avec ou sansboucle
I simpleou avec desarˆetes multiples
I color´es(sommets ou arˆetes)
I valu´es(sommets ou arˆetes)
v1
v2
v3
v4 v1
v2
v3
v4
Types de graphes
Suivant le type de probl`eme que l’on cherche `a r´esoudre, on peut consid´erer des graphes
I non-orient´eouorient´e.
I avec ou sansboucle
I simpleou avec desarˆetes multiples
I color´es(sommets ou arˆetes)
I valu´es(sommets ou arˆetes)
6 2
3
14 v1
v2
v3
v4
2
3 4 2
1
Degr´ es
Definition
Ledegr´ed’un sommetv, not´ed(v), d´esigne son nombre de voisins.
Dans le cas des graphes dirig´es, on distingue ledegr´e sortantd+(v)et ledegr´e entrantd−(v).
Dans le cas de graphe valu´e, le degr´e consid´er´e est parfois la somme des poids des arˆetes incidentes au sommetv.
Proposition
Un graphe non orient´e v´erifie X
v∈V(G)
d(v) = 2m.
Un graphe orient´e v´erifie X
v∈V(G)
d+(v) = X
v∈V(G)
d−(v) =m.
Codage d’un graphe
Il y a principalement trois types de codages pour un graphe :
Matrice d’adjacence matrice carr´eeM de taillen×ntel queMuvrepr´esente l’interaction entreu etv :0s’il n’y a pas d’arˆete,1si il y a une arˆete deu versv.
Dans le cas non-dirig´e, cette matrice est sym´etrique.
Dans le cas arˆete-valu´e, on remplace le coefficient1par le poids de l’arˆete concern´ee.
Liste d’arˆetes matrice de taillem×2, chaque ligne repr´esentant les deux sommets reli´es par une arˆete.
Dans le cas orient´e, l’ordre d’apparition des sommets sur la ligne indique le sens de l’arˆete.
Dans le cas arˆete-valu´e, on ajoute une troisi`eme colonne contenant les poids.
Liste de voisinages Liste ayant un ´el´ement par sommet. Cet ´el´ement contient l’identit´e d’un sommet puis la liste de ses voisins (seulement les voisins externes dans les cas d’un graphe orient´e).
Codage d’un graphe
Stockage u etv sont-ils voisins ? degr´e d’un sommetv
Matrice d’adjacence O(n2) O(1) O(n)
Liste d’arˆete O(m) O(m) O(m)
Liste d’adjacence O(m) O(n) O(n)
I Les deux derni`eres facons de stocker un graphe sont beaucoup plus efficaces, surtout dans le cas de graphes creuses (m<<n2).
Isomorphisme de graphes
La repr´esentation graphique d’un graphe n’est pas unique.
Isomorphisme de graphes
Deux graphesG= (V(G),E(G))etH = (V(H),E(H))sontisomorphess’il existe une bijectionφ:E(G)→E(H)telle que(u,v)∈E(G)si et seulement si(φ(u), φ(v))∈E(H).
v1
v2
v3
v4 w1
w2
w3
w4
I Dans le cas des graphes valu´es, il faut que la bijection pr´eserve aussi les poids.
Chemins et marches
Chemin et marche
Uncheminde longueurk entre deux sommetsu etv est une suite dek arˆetes (ui,ui+1)tels queu0=u,uk=v et tous lesui sont disjoints.
Dans le cas de graphes orient´es, unchemin orient´en´ecessite l’orientation des arˆetes dans le sens−−−−→uiui+1.
Si les arˆetes et les sommets ne sont pas tous disjoints, on parle demarcheentre u etv.
v1
v2
v3
v4
v5
v6
v7
v8
I v6,v3,v2,v4est un chemin de longueur3.
I v7,v4,v8,v7,v5 est une marche.
Chemins et marches
Chemin et marche
Uncheminde longueurk entre deux sommetsu etv est une suite dek arˆetes (ui,ui+1)tels queu0=u,uk=v et tous lesui sont disjoints.
Dans le cas de graphes orient´es, unchemin orient´en´ecessite l’orientation des arˆetes dans le sens−−−−→uiui+1.
Si les arˆetes et les sommets ne sont pas tous disjoints, on parle demarcheentre u etv.
v1
v2
v3
v4
v5
v6
v7
v8
I v6,v3,v2,v4est un chemin orient´e.
I v4,v8,v7,v5n’en est pas un.
Cycles
Definition
Uncyclede longueurk est une suite dek arˆetes(ui,ui+1)tels queu0=uk et tous lesui sont disjoints.
Dans le cas de graphes orient´es, uncycle orient´en´ecessite l’orientation des arˆetes dans le sens−−−−→uiui+1.
v1
v2
v3
v4
v5
v6
v7
v8
I v6,v3,v2,v5,v7,v8 est un cycle de longueur6.
Graphe connexe
Connexit´e
Un graphe non orient´e estconnexesi toute paire de sommets est reli´ee par un chemin.
Si le graphe n’est pas connexe, il peut ˆetre d´ecompos´e de fa¸con unique en composantes connexes, qui sont les ensembles maximaux de sommets induisant des sous-graphes connexes.
v1
v2
v3
v4
v5
v6
v7
v8
Graphe orient´ e fortement connexe
Definition
Un graphe orient´e estfortement connexesi pour toute paire(u,v)de sommets, il existe un chemin orient´e deu versv et un chemin orient´e dev versu.
Il est ditsimplement connexesi le graphe non-orient´e sous-jacent est connexe.
v1
v2
v3
v4
v5
v6
v7
v8
v1
v2
v3
v4
v5
v6
v7
v8
Distance et diam` etre
Definition
Ladistanceentre deux sommetsu etv appartenant `a la mˆeme composante connexe d’un graphe arˆete-valu´e est le poids minimum d’un chemin entreu et v.
I Dans le cas de graphe non-valu´e, cela revient `a consid´erer la longueur du plus court chemin.
I Dans le cas des graphes dirig´es, il faut pr´eciser si on se restreint aux chemins dirig´es (auquel cas la distance n’est plus sym´etrique et donc plus une distance au sens math´ematique !) ou si on travaille avec le graphe non-dirig´e sous-jacent.
I Dans le cas de graphes non connexes, les sommets appartenant `a des composantes diff´erentes sont consid´er´es comme ayant une distance infinie.
Distance et diam` etre
Definition
Lediam`etred’un graphe est la plus grande distance existant entre deux sommets d’un graphe.
diam(G) = max(d(u,v)|u,v∈V) = min(d|∀u,v ∈V,d(u,v)≤d)
v1
v2
v3
v4
v5
v6
v7
v8
I La distance dev3 `av5 est de2.
I Quel est le diam`etre deG?
II. Parcours de graphes : arbres couvrants
II.1 Arbres
D´ efinition
Arbre
Un graphe non-orient´e connexe et acyclique est appel´e unarbre.
Proposition
Un graphe connexe est un arbre si et seulement si toute suppression d’arˆete le rend non-connexe.
En d’autres termes, un arbre est un graphe connexe minimal.
Arbre enracin´ e
D´efinition
Consid´erons un entiernet un grapheGdont les sommets ont une ´etiquette appel´eeniveau construit par le processus suivant :
I on initialiseV(G)`a un sommetr de niveau0,E(G)`a l’ensemble vide.
I pouri entre1etn,
pour tout sommetv de niveaui,
on ajoute `aV(G)un nombre fini de sommetsw1, . . . ,wkv dont le niveau esti+ 1, et on ajoute `aE(G)les arˆetes{(v,wi),1≤i ≤wi}.
Le grapheGest unarbre enracin´e.r est appel´eracinedeG.
Les sommets(w1, . . . ,wkv de niveaui+ 1li´es `a un sommetv de degr´ei sont appel´es lesfilsdev.v est lep`erede ses sommets. On en d´eduit la notion de descendantset d’ancˆetresd’un sommet.
Un sommet sans fils est appel´e unefeuille.
Arbre enracin´ e
r
v1 v2
v3 v4 v5
v6 v7 v8
Proposition
Tout arbre enracin´e est un arbre. De plus, pour tout arbreT et tout sommet de r∈V(T),T peut ˆetre construit comme un arbre enracin´e de raciner.
Cons´equence :Tout arbre an−1arˆetes.
Int´ erˆ et des arbres
1. Structure ad´equate pour certaines mod´elisations (´evolution, pedigrees...).
De nombreux probl`emes ne pouvant pas ˆetre r´esolus en temps polynomial sur les graphes en g´en´eral peuvent l’ˆetre en temps polynomial sur les arbres.
2. Structure naturelle pour r´esoudre des probl`emes d’´enum´eration.
I Enum´erer l’ensemble des mots de quatre lettres qu’on peut ´ecrire avec ABC
I Enum´erer l’ensemble des mots de quatre lettres qu’on peut ´ecrire avec ABC et contenant au moins 2 lettres A
3. Structure la moins lourde en termes d’arˆetes pour encoder la connexit´e :n sommets reli´es par un arbre forment un ensemble connexe, et on ne peut pas utiliser moins d’arˆetes pour y arriver.
Arbre couvrant
Definition
SoitGun graphe. Un arbre couvrant deG est un sous-grapheT deGtel que T est un arbre etV(T) =V(G).
v1
v2
v3
v4
v5
v6
v7
v8
Arbre couvrant
Th´eor`eme
Un graphe est connexe si et seulement si il admet un arbre couvrant.
Cons´equences :
1. Un graphe connexe est un arbre si et seulement si il an−1arˆetes.
2. D´ecider si un graphe est connexe est ´equivalent `a d´ecider qu’il admet un arbre couvrant.
II.2 Parcours en largeur
Probl` eme
SoitGun graphe.
I Est-t il connexe ?
I Combien a-t-il de composantes connexes ?
I Lister tous les sommets dans la mˆeme composante connexe qu’un sommet d’int´erˆet.
Approche :Rechercher un (ou des) arbres couvrants, possiblement enracin´es sur le sommet d’int´erˆet.
Arbre de parcours en largeur
I Appel´eBFSpourBreadth-First Search
I L’id´ee est de prendre un `a un les sommets d´ej`a visit´es et de nettoyer leur voisinage, en ajoutant tous leur voisins non-visit´es.
I D’un point de vue pratique, cela revient `a utiliser unefile, ou FIFO (First In, First Out), pour stocker les sommets visit´es.
I Le premier sommet de la file est le sommet courant, ses voisins sont ajout´es un `a un en bout de file. Quand tous ses voisins sont visit´es, le sommet est supprim´e de la file et ne la r´eint´egrera plus.
BFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
F={v3}
BFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v1
F ={v3,v1}
BFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v1 v2
F ={v3,v1,v2}
BFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v1 v2 v6
F={v3,v1,v2,v6} puisF={v1,v2,v6}
BFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v1 v2 v6
F ={v1,v2,v6} puisF ={v2,v6}.
Aucun sommet n’est ajout´e `a la file.
BFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v1 v2 v6
v4 v5
F ={v2,v6,v4} puisF ={v2,v6,v4,v5}
puisF={v6,v4,v5}
BFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v1 v2 v6
v4 v5 v8
F={v6,v4,v5,v8} puisF={v4,v5,v8}
BFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v1 v2 v6
v4 v5 v8
v7
F={v4,v5,v8,v7} puisF se vide et l’algorithme
s’arrˆete.
BFS : pseudo-code
Data:Un grapheGet un sommetv Result:Un arbreT enracin´e env F={v};T =v
for u sommet deG do u.visit´e=FALSE end
while F 6=∅do
u = premier ´el´ement deF forw voisin deu do
if w.visit´e =FALSE then w.visit´e=TRUE Ajouterw `aF
Ajouterw et(u,w)`aT end
end
Supprimeru deF end
Algorithm 1:Algorithme BFS
BFS
Proposition
BFS construit un arbre enracin´e env contenant tous les sommets de la composante connexe dev.
Proposition
BFS est de complexit´eO(m).
I Non-unicit´e du parcours suivant l’ordre dans lequel les voisins sont parcourus.
I En ajoutant une boucle choisissant un nouveau point de d´epart tant qu’il reste des sommets non-visit´es, on obtient un algortihme qui couvre tout graphe avec uneforˆetcontenant autant d’arbres que le graphe a de composantes connexes.
BFS et distance
On consid`ere un grapheGnon valu´e.
SoitT un arbre BFSenracin´e enr. Pour tout sommetu, on noteniv(u)le niveau deu dansT.
Proposition
Pour tout(u,v)∈E(G),|niv(u)−niv(v)| ≤1.
Proposition
Pour toutu∈V(G),niv(u) =d(u,r).
BFS orient´ e
On consid`ere un grapheGorient´e, et on applique BFS en n’ajoutant `a chaque
´etape que les voisins ext´erieurs du sommet courant.
I Les sommets visit´es sont ceux qui peuvent ˆetre atteints depuis la racine par un chemin orient´e.
I G ne contient aucune arˆete orient´ee d’un sommetu vers un sommet de niveau≥niv(u) + 2.
I Le chemin du BFS de la racine vers tout sommet visit´e est un plus court chemin orient´e.
II.3 Parcours en profondeur
Probl` eme
SoitGun graphe.
I Est-t il connexe ?
I Combien a-t-il de composantes connexes ?
I Lister tous les sommets dans la mˆeme composante connexe qu’un sommet d’int´erˆet.
Approche :Rechercher un (ou des) arbres couvrants, possiblement enracin´es sur le sommet d’int´erˆet.
Arbre de parcours en profondeur
I Appel´eDFSpourDepth-First Search
I L’id´ee est d’aller aussi loin que possible dans le graphe, et de rebrousser chemin quand on ne peut plus avancer.
I D’un point de vue pratique, cela revient `a utiliser unepile, ou LIFO (Last In, First Out), pour stocker les sommets visit´es.
I Le sommet du haut de la pile est le sommet courant. S’il a un voisin non visit´e, celui-ci est ajout´e sur la pile. S’il n’en a pas, le sommet courant est supprim´e.
Un sommet peut ˆetre le sommet courant `a des moments distincts de l’algorithme mais lorsqu’il est supprim´e de la pile, il ne la r´eint´egrera plus.
DFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
P={v3}
DFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v2
P ={v3,v2}
DFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v2
v4
P ={v3,v2,v4}
DFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v2
v4
v8
P={v3,v2,v4,v8}
DFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v2
v4
v8
v6
P ={v3,v2,v4,v8,v6} puisP ={v3,v2,v4,v8}
DFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v2
v4
v8
v6 v7
P ={v3,v2,v4,v8,v7}
DFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v2
v4
v8
v6 v7
v5
P ={v3,v2,v4,v8,v7,v5} puis se d´epile jusqu’`a
P ={v3,v2}
DFS : illustration
v1
v2
v3
v4
v5
v6
v7
v8
v3
v2
v4
v8
v6 v7
v5
v1
P ={v3,v2,v1} puis se d´epile jusqu’`a ˆetre vide.
DFS : pseudo-code
Data:Un grapheGet un sommetv Result:Un arbreT enracin´e env P={v};T=v;
for u sommet deG do u.visit´e=FALSE end
v.visit´e=TRUE while P 6=∅do
u = dernier ´el´ement deP
if il existew voisin deu avecw.visit´e=FALSE then w.visit´e=TRUE
Ajouterw `aP
Ajouterw et(u,w)`aT end
else
Supprimeru deP; end
end
Algorithm 2:Algorithme DFS
DFS : pseudo-code r´ ecursif
Data:Un grapheGet un sommetv Result:Un arbreT enracin´e env P=∅;T =v
for u sommet deG do u.visit´e=FALSE end
FunctionDFS(G,T,u) u.visit´e = TRUE forw voisin deu do
if w.visit´e=FALSE then Ajouterw et(u,w)`aT DFS(G,T,w)
end end DFS(G,T,v)
Algorithm 3:Algorithme DFS r´ecursif
DFS
Proposition
DFS construit un arbre enracin´e env contenant tous les sommets de la composante connexe dev.
Proposition
DFS est de complexit´eO(m).
I Non-unicit´e du parcours suivant l’ordre dans lequel les voisins sont parcourus.
I En ajoutant une boucle choisissant un nouveau point de d´epart tant qu’il reste des sommets non-visit´es, on obtient un algorithme qui couvre tout graphe avec uneforˆetcontenant autant d’arbres que le graphe a de composantes connexes.
I Toutes ces propri´et´es sont identiques avec BFS.
Topologie des DFS
SoitT un DFS sur un grapheG.
I Aucun rapport entre la distance `a la racine et la distance dansG(ex : graphe r´eduit `a un cycle).
I Par contre, aucune arˆete non d´ecouverte ne correspond `a une arˆete transversale entre deux branches :
Proposition
Soit(u,v)une arˆete deG,u´etant le premier sommet d´ecouvert par le DFS.
Alorsu est un ancˆetre dev.
DFS orient´ e
On consid`ere un grapheGorient´e, et on applique DFS en n’ajoutant `a chaque
´etape que les voisins ext´erieurs du sommet courant.
I Les sommets visit´es sont ceux qui peuvent ˆetre atteints depuis la racine par un chemin orient´e.
I Si on trace les branches deT de la gauche vers la droite, il n’y a aucune arˆete dansGqui ajouterait `aT une arˆete transversale de la gauche vers la droite.
II.4 Arbre couvrant de poids minimal
Probl` eme
SoitGun graphe valu´e.
Trouver un arbre couvrant de poids minimal.
Applications
I directes : construire des r´eseaux (´electriques, informatiques, ...) les moins chers possibles.
I indirectes : brique de base pour de nombreux autres algorithmes (par ex.
approximation du voyageur de commerce).
Algorithme de Kruskal
Data:Un graphe connexe valu´eG
Result:Un arbre couvrantT de poids minimal
Ranger les arˆetes deGpar poids croissant dans une listeL; F une forˆet couvrante sans arˆetes
while F n’est pas un arbre do e = premi`ere arˆete deL
if les extremit´es dee ne sont pas dans le mˆeme arbre deF then F =F+e
end
Supprimere deL end
Algorithm 4:Algorithme de Kruskal
Algorithme de Kruskal : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
Algorithme de Kruskal : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
Algorithme de Kruskal : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
Algorithme de Kruskal : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
Algorithme de Kruskal : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
Algorithme de Kruskal : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
Algorithme de Kruskal : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
Algorithme de Kruskal : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
Algorithme de Kruskal : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
Algorithme de Kruskal
Proposition
L’algorithme de Kruskal renvoie bien, pour un graphe connexe, un arbre couvrant de poids minimal.
Proposition
Sa complexit´e est deO(mlogm).
I SiGn’est pas connexe, le r´esultat est une forˆet dont chaque arbre est un arbre couvrant de poids minimal de l’une des composantes connexes deG.
I En cas d’existence d’arˆetes de poids ´egal, la solution peut ne pas ˆetre unique.
I La mani`ere de coder les composantes connexes est primordiale pour obtenir une complexit´e optimale.
I L’op´eration limitante du point de vue de la complexit´e est le tri.
Complexit´ e de Kruskal : Union-Find
I Trierm arˆetes se fait enO(mlogm)
I Pour chaque arˆete(x,y), il faut
I trouver la composante connexe dex ety : fonctionFIND
I comparerFIND(x)etFIND(y)
I si ils sont diff´erents, fusionner les deux composantes connexes : op´eration UNION
Soitα(n,m)la somme des complexit´es deFIND etUNION. La complexit´e de l’algorithme de Kruskal est alorsO(mlogm+mα(n,m).
Complexit´ e de Kruskal : Union-Find
Une solution simple mais non-optimale
On stocke pour chaque sommet un nombre correspondant `a sa composante connexe.
sommet 1 2 3 4 5 6 7 8 9
composante 1 2 1 3 1 3 3 1 1
FINDest en temps constant,UNION enO(n):α=O(n).
Complexit´ e de Kruskal : Union-Find
Autre solution : chaque composante connexe est repr´esent´ee par un arbre enracin´e
I il suffit de stocker son p`ere pour chaque sommet, les racines ´etant leur propre p`ere. Les racines servent de repr´esentant de la classe.
3
1 5
2 4
6 7
8 9
sommet 1 2 3 4 5 6 7 8 9
p`ere 3 2 3 4 3 4 4 1 1
Complexit´ e de Kruskal : Union-Find
Autre solution : chaque composante connexe est repr´esent´ee par un arbre enracin´e
I FIND(x)revient `a remonter l’arbre de p`ere en p`ere jusqu’`a faire du sur-place. On est alors `a la racine, et on renvoit la valeur de celle-ci : complexit´eO(h), o`uh est la hauteur de l’arbre.
3
1 5
2 4
6 7
8 9
sommet 1 2 3 4 5 6 7 8 9
p`ere 3 2 3 4 3 4 4 1 1
FIND(8) = 3
Complexit´ e de Kruskal : Union-Find
Autre solution : chaque composante connexe est repr´esent´ee par un arbre enracin´e
I UNION consiste `a rassembler les deux arbres en un seul. Pour cela, on d´eclare comme p`ere de la racine du plus petit arbre la racine du plus grand : complexit´e en temps constant.
3
1 5
2 4
6 7
8 9
UNION(1,7)
sommet 1 2 3 4 5 6 7 8 9
p`ere 3 2 3 3 3 4 4 1 1
3
1 5 4
6 7
8 9
Complexit´ e de Kruskal : Union-Find
Proposition
La hauteur d’un arbre avecssommets, construit par une suite d’applications de UNION, est major´e par1 + log2s.
On en d´eduit queα=O(logm)et donc que l’algorithme de Kruskal est de complexit´eO(mlogm).
Complexit´e amortie
I Quand on remonte dans l’arbre vers la raciner, on fait de chaque sommet parcouru un fils der.
I Op´ererr FIND ets UNION se fait en0(r+sf(r,s))o`uf est une fonction qui croˆıt tr`es lentement (f(n,m)≤4pourn,m≤22048).
I La s´election d’arˆetes peut donc ˆetre consid´er´ee comme de complexit´e O(m), ce qui permet d’obtenir une meilleure complexit´e si les poids des arˆetes sont telles que le tri peut se faire plus rapidement.
Complexit´ e de Kruskal : Union-Find
Proposition
La hauteur d’un arbre avecssommets, construit par une suite d’applications de UNION, est major´e par1 + log2s.
On en d´eduit queα=O(logm)et donc que l’algorithme de Kruskal est de complexit´eO(mlogm).
Complexit´e amortie
I Quand on remonte dans l’arbre vers la raciner, on fait de chaque sommet parcouru un fils der.
I Op´ererr FIND ets UNION se fait en0(r+sf(r,s))o`uf est une fonction qui croˆıt tr`es lentement (f(n,m)≤4pourn,m≤22048).
I La s´election d’arˆetes peut donc ˆetre consid´er´ee comme de complexit´e O(m), ce qui permet d’obtenir une meilleure complexit´e si les poids des arˆetes sont telles que le tri peut se faire plus rapidement.
Algorithme de Prim
Data:Un graphe connexe valu´eGet un sommetv Result:Un arbre couvrantT de poids minimal T={v}
while il existe des arˆetes deT versG\T do
Trouver l’arˆetee de poids minimal deT versG\T T=T+e
end
Algorithm 5:Algorithme de Prim
Algorithme de Prim : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
V(T) ={v3}
Algorithme de Prim : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
V(T) ={v3,v1}
Algorithme de Prim : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
V(T) ={v3,v1,v6}
Algorithme de Prim : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
V(T) ={v3,v1,v6,v2}
Algorithme de Prim : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
V(T) ={v3,v1,v6,v2,v4}
Algorithme de Prim : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
V(T) ={v3,v1,v6,v2,v4,v7}
Algorithme de Prim : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
V(T) ={v3,v1,v6,v2,v4,v7,v8}
Algorithme de Prim : exemple
v1
v2
v3
v4
v5
v6
v7
v8
3
1 4
3 5
2
4
6 1 2
3
V(T) ={v3,v1,v6,v2,v4,v7,v8,v5}
Algorithme de Prim
Proposition
L’algorithme de Prim renvoie bien, pour un graphe connexe, un arbre couvrant de poids minimal.
Proposition
Sa complexit´e est deO(mn)pour un code na¨ıf.
Elle peut ˆetre abaiss´ee enO(mlogn)en codant `a l’aide de tas binaires et en O(m+nlogn)`a l’aide de tas de Fibonacci.
I SiGn’est pas connexe, le r´esultat est un arbre couvrant de poids minimal de la composante connexe deG. Le relancer tant qu’il existe des sommets non couverts permet de trouver une forˆet couvrante de poids minimal.
I En cas d’existence d’arˆetes de poids ´egal, la solution peut ne pas ˆetre unique.
I La complexit´e th´eorique (pire cas) est l´eg`erement meilleure que celle de Kruskal au prix d’une impl´ementation minutieuse.
I Il ne n´ecessite pas l’exploration `a priori de tout le graphe.
II.5 Algorithme de Dijkstra
Probl` eme
On consid`ere un grapheGvalu´e et deux sommetsu etv deG. Trouver le plus court chemin (au sens de la somme des poids) entreu etv.
I l’approche gloutonne ´echoue ici.
I le probl`eme est trivial `a r´esoudre dans un arbre.
I l’algorithme de Dijkstra r´esout un probl`eme plus g´en´eral
On consid`ere un graphe valu´eG et un sommetu deG. Construire un arbre couvrantTu tel que, pour tout sommetv, la distance deu `av est la mˆeme dansG et dansTu.
Probl` eme
On consid`ere un grapheGvalu´e et deux sommetsu etv deG. Trouver le plus court chemin (au sens de la somme des poids) entreu etv.
I l’approche gloutonne ´echoue ici.
I le probl`eme est trivial `a r´esoudre dans un arbre.
I l’algorithme de Dijkstra r´esout un probl`eme plus g´en´eral
On consid`ere un graphe valu´eG et un sommetu deG. Construire un arbre couvrantTu tel que, pour tout sommetv, la distance deu `av est la mˆeme dansG et dansTu.
Illustration
v1
v2
v3
v4
v5
v6
v7
v8
3
1 1
3 5
2
4
6 1 2
3
Sommet v1 v2 v3 v4 v5 v6 v7 v8
Distance (rouge si finale) 0 3 1 ∞ ∞ ∞ ∞ ∞
Illustration
v1
v2
v3
v4
v5
v6
v7
v8
3
1 1
3 5
2
4
6 1 2
3
Sommet v1 v2 v3 v4 v5 v6 v7 v8
Distance (rouge si finale) 0 2 1 ∞ ∞ 3 ∞ ∞
Illustration
v1
v2
v3
v4
v5
v6
v7
v8
3
1 1
3 5
2
4
6 1 2
3
Sommet v1 v2 v3 v4 v5 v6 v7 v8
Distance (rouge si finale) 0 2 1 5 7 3 ∞ ∞
Illustration
v1
v2
v3
v4
v5
v6
v7
v8
3
1 1
3 5
2
4
6 1 2
3
Sommet v1 v2 v3 v4 v5 v6 v7 v8
Distance (rouge si finale) 0 2 1 5 7 3 ∞ 9
Illustration
v1
v2
v3
v4
v5
v6
v7
v8
3
1 1
3 5
2
4
6 1 2
3
Sommet v1 v2 v3 v4 v5 v6 v7 v8
Distance (rouge si finale) 0 2 1 5 7 3 7 8
Illustration
v1
v2
v3
v4
v5
v6
v7
v8
3
1 1
3 5
2
4
6 1 2
3
Sommet v1 v2 v3 v4 v5 v6 v7 v8
Distance (rouge si finale) 0 2 1 5 7 3 7 8
Data:Un graphe connexe valu´eGde fonction de poidsωet un sommetu Result:Un arbre couvrantT et la distanceD(v) =dG(u,v)pour toutv T={u}
for v ∈V(G)do
dist prov(v) :=∞;pere(v) :=∅ end
dist finale(u) := 0;dernier ajout :=u while V(T)6=V(G)do
forv voisin dedernier ajout do
if dist finale(dernier ajout) +ω(dernier ajout,v)<dist prov(v) then
dist prov(v) :=dist finale(dernier ajout) +ω(dernier ajout,v) pere(v) :=dernier ajout
end end
Selectionnerv ∈/V(T)tel quedist prov est minimum Ajouter(pere(v),v)aT
dist finale(v) :=dist prov(v) dernier ajout:=v
end
Algorithm 6:Algorithme de Dijkstra
Algorithme de Dijkstra
Proposition
L’algorithme de Dijkstra renvoie bien la distance de tout sommet au sommet d’origine.
Proposition
La complexit´e est polynomiale. Elle est en O(n2)pour un code na¨ıf, et peut ˆetre r´eduite `aO(m+nlogn)`a l’aide de tas binaire et mˆemeO(m+nlogn)`a l’aide de tas de Fibonacci.
Algorithme de Floyd-Warshall
I L’algorithme de Dijkstra ne s’applique pas si le graphe contient des arˆetes de poids n´egatif.
Floyd-Warshall
L’algorithme de Floyd-Warshall permet de calculer les distances entretoutes les paires de sommets, mˆeme si certaines arˆetes sont de poids n´egatif, `a condition qu’il n’y ait aucun cycle de poids strictement n´egatif.
Algorithme de Floyd-Warshall : principe
On num´erote les sommets de1`an.
On calcule pour toutk la matriceWk telle queWuvk contient le poids du chemin de poids minimal entreu etv dont tous les sommets internes appartiennent `a{1, . . . ,k}.
I Wijk = min(Wijk−1,Wikk−1+Wkjk)
I Wijn,1≤k ≤n est le poids du plus court chemin.
I La complexit´e est deO(n3).
IV. Flots dans les graphes
Probl` eme
On consid`ere un graphe dirig´eGtel que :
1. il existe deux ensembles disjointsS etP de sommets, respectivement appel´es sources et puits ;
2. chaque arˆetee est valu´e par une capacit´ec(e)correspondant au flux maximum pouvant transiter par cette arˆete.
Probl`eme
Quel est le flux maximal pouvant aller des sources vers les puits sans perte interm´ediaire ?
I Dans le cas d’un graphe non-dirig´e, on remplace chaque arˆete par deux arˆetes dirig´ees oppos´ees de mˆeme capacit´e que l’arˆete initiale.
Flot
Notations
I Pour tout ensembleAde sommets, on noteA=V(G)\Aet(A,A) l’ensemble des arˆetes deAversA.
I Pour toute fonctionf :E(G)→R, on notef+(A) =P
c∈(A,A)f(c)et f−(S) =P
c∈(A),Af(c).
Definition
Unflotest une fonctionf :E(G)→Rtelle que : 1. pour toute,0≤f(e)≤c(e);
2. pour tout sommetv ∈/S∪P,f+(v) =f−(v).
Flot
Exemple
Valeur d’un flot
Proposition
Pour tout flotf dansG,f+(S)−f−(S) =f−(P)−f+(P). Cette valeur est not´eeval(f).
Definition
Un flotf est maximal s’il n’existe pas de flotf0avecval(f0)>val(f).
Combien de sources et de puits ?
Proposition
Probl`eme 1 :Soit(G,c)un graphe dirig´e valu´e,S⊂V(G),P ⊂V(G).
D´eterminer un flot maximal deS versP.
Probl`eme 2 :Soit(H,c)un graphe dirig´e valu´e,s∈V(H),p∈V(H).
D´eterminer un flot maximal desversp.
Les probl`emes 1 et 2 sont ´equivalents.
I On se limite dor´enavant au cas o`u il y a une source et un puits
Coupe
Definition
Unecoupeest un coupleK = (A,A)tel ques∈Aetp∈A. Lacapacit´e d’une coupecap(K)est la somme des capacit´es des ses arˆetes.
Proposition
Pour toute coupeK = (A,A)et tout flotf,val(f) =f+(A)−f−(A).
Par cons´equent, pour toute coupeK et tout flotf,val(f)≤cap(K).
En particulier,maxfval(f)≤minKcap(K).
Th´ eor` eme max-flot min-cut
Th´eor`eme
Dans tout r´eseau, le flot maximal a pour valeur la capacit´e de la coupe minimale.
I La preuve de ce th´eor`eme est constructive, `a savoir qu’on va montrer l’existence de ce flot en pr´esentant une mani`ere de le construire (et donc de r´esoudre le Probl`eme 2).
Saturation d’un chemin
Definition
Soitf un flot etP un chemin entres etp, les arˆetes pouvant ˆetre parcourues dans les deux sens. Soite(P)−les arˆetes parcourues `a contre-sens parP et e(P)+ celle parcourues dans le bon sens. La saturation du cheminP est alors d´efinie par
sat(P) = min min
e∈e(P)+(c(e)−f(e)), min
e∈e(P)−f(e) Sisat(P) = 0, le chemin est ditsatur´e.
Saturation d’un chemin
I L’existence d’un chemin non satur´e permet d’augmenter la valeur def. En effet, en ajoutantsat(P)sur les arˆetes dee(P)+ et en enlevantsat(P) sur les arˆetes dee(P)−, on obtient un nouveau flot dont la valeur a augment´e desat(P).
I En fait, il s’agit d’une condition n´ecessaire et suffisante pour pouvoir augmenter un flot :
Proposition
Un flotf est maximal si et seulement si il n’y a pas de chemin non-satur´e entre setp.
Construction d’un flot maximal
Recherche d’un chemin satur´e
On utilise une variante de l’arbre de parcours en profondeur enracin´e ens :
I on parcourt une arˆete dans le bon sens uniquement si elle n’est pas satur´ee ;
I on parcourt une arˆete `a contresens uniquement si son flot est non-nul.
Sip est atteint lors de ce parcours, le cheminP allant des `apdans l’arbre de parcours est un chemin non-satur´e. Sa sturation vaut
α= min mine∈e(P)+(c(e)−f(e)),mine∈e(P)−f(e) .
Construction d’un flot maximal
I on part d’un flot connu, par exemple le flot nul.
I tant que l’on trouve un chemin non-satur´e entres etp (parfois appel´e chemin augmentant), on remet le flot `a jour. Quand cela n’est plus possible, l’algorithme stoppe.
Une cons´ equence : le(s) th´ eor` eme(s) de Menger
Th´eor`emeMenger SoitS etP deux ensembles de sommets d’un grapheG. Pour tout entierk, soit il existek+ 1chemins arˆetes-disjoints reliantS `aP, soit il existe au plusk arˆetes dont la suppression d´econnecteS deP.
Definition
Un graphe estk-connexe si, pour toute paire de sommetsu etv, il existek chemins disjoints, c’est-`a-dire n’ayant aucun sommet interne en commun.
Definition
Un s´eparateur d’un graphe est un ensemble de sommetsX tel queG\X a un nombre de composantes connexes sup´erieur `a celui deG.
SoitS etP deux ensembles de sommets. Un(S,P)-s´eparateurX est un s´eparateur tel qu’aucun chemin reliant un sommet deS `a un sommet deP n’existe dansG\X.
Th´eor`eme
Menger Un graphe contientk chemins disjoints entre deux ensembles de sommetsS etP si et seulement siGne contient pas de(S,P)-s´eparateur de taille au plusk−1.
Un graphe estk-connexe si et suelement siGne contient pas de s´eparateur de taille au plusk−1.