Telechargé par Nour En

poly

publicité
Graphes et algorithmes
Licence 2 — Informatique
Denis Robilliard
Denis Robilliard
Graphes et algorithmes
1 / 82
Sommaire général
1
2
3
4
5
6
Introduction
Représentation informatique
Préparation aux TPs
Notions élémentaires
Exploration d’un graphe
Parcours et Connexité
()
8
Graphes particuliers
Algorithmes sur les graphes
particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
7
Graphes et algorithmes
2 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
3 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
4 / 82
Avertissement
Théorie des graphes = aspects mathématiques et formels des graphes.
En pratique, on s’attachera ici surtout aux algorithmes sur les graphes.
Compétences à acquérir :
I
I
I
I
I
savoir employer le vocabulaire et reconnaître les concepts de base de la
théorie des graphes,
savoir reconnaître les cas d’applications des algorithmes essentiels sur les
graphes,
savoir les coder en C++,
savoir exécuter sur papier ces algorithmes dans le cas de graphes simples,
savoir utiliser la méthodologie de développement piloté par les tests lorsque
les tests sont fournis.
()
Graphes et algorithmes
5 / 82
Origines
En 1736, le mathématicien Euler s’intéresse au problème des “ponts de Königsberg”:
Peut-on faire une promenade qui passe une et une seule fois par chacun
des ponts de Königsberg et revient à son point de départ?
A
B
C
D
()
Graphes et algorithmes
6 / 82
Origines
Il modélise le problème avec:
des “ronds” : les sommets ou noeuds (vertex/ices or nodes) :
des “traits” : les arcs (orientés) ou arêtes (non orientées)
([directed] edges, links):
x0
A
B
C
x1
x2
D
Figure: À gauche, graphe non orienté modélisant le problème des ponts de
Königsberg, à droite exemple de graphe orienté.
()
Graphes et algorithmes
6 / 82
Motivations
Depuis, les graphes sont utilisés comme outil de modélisation dans une grande
variété de problèmes:
Génie logiciel: architecture des applications, représentation des structures
de données, graphe d’héritage entre classes dans les langages à objets...
Problèmes de routage et de distribution: logistique, distribution
d’électricité, d’eau...
Diagrammes divers: circuits électriques, organisations hiérarchiques...
Résolution de problèmes par une succession de décisions (arc =
décision).
()
Graphes et algorithmes
7 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
8 / 82
Matrice d’adjacence
Les sommets origines des arcs indicent les lignes de la matrice, les
sommets destinations indicent les colonnes;
Interprétation booléenne: un 1 ou un 0 à l’emplacement (i , j ) de la matrice
correspond respectivement à la présence ou l’absence d’un arc entre les
sommets i et j (voir exemple ci-dessous);
Interprétation “matrice aux arcs”: on place en (i , j ) le nom de l’arc, rien s’il
n’y a pas d’arc;
Interprétation pour les graphes valués: on place en (i , j ) la valeur
associée à chaque arc. On utilise une convention adéquate pour
l’absence d’arc.
x1
x1
x2
x3
x3
x2
x1
0
1
0
x2
1
0
1
x3
1
0
1
← destination
↑
origine
()
Graphes et algorithmes
9 / 82
Matrice d’adjacence – Complexité en mémoire
Complexité en mémoire = espace mémoire utilisé, exprimé en fonction
d’une mesure de la taille du problème
I
Exemple: trier un tableau de N données par le tri à bulles, est de complexité
en mémoire : N+1 (une variable supplémentaire pour échanger).
Ici la complexité mémoire de la représentation en matrice d’adjacence
d’un graphe d’ordre N est: N 2 .
()
Graphes et algorithmes
10 / 82
Matrice d’incidence
Chaque ligne de la matrice est associée à un sommet et indique les arcs
sortants et entrants dans ce sommet;
Chaque colonne est indicée par un arc;
À l’emplacement (i , j ) de la matrice on trouve 1 ou -1 pour un arc j
respectivement sortant ou entrant dans le sommet i;
Note: on ne peut pas représenter un arc bouclant sur un sommet dans
cette convention.
x1
u1
x2
()
u2
u4
u3
x1
x2
x3
u1
-1
1
0
u2
1
-1
0
u3
1
0
-1
u4
0
-1
1
x3
Graphes et algorithmes
11 / 82
Matrice d’incidence – Complexité en mémoire
La complexité en mémoire de la représentation en matrice d’incidence
d’un graphe d’ordre N et de taille M (arcs/arêtes) est: N*M.
Cette représentation peut être intéressante dans le cas particulier où M
est petit devant N (plutôt rare).
()
Graphes et algorithmes
12 / 82
Liste d’adjacence
Elle associe à chaque sommet la liste de ses successeurs.
La complexité en mémoire d’une telle représentation d’un graphe d’ordre
N et de taille M est de l’ordre de N+M (info des sommets + info des
successeurs). C’est souvent bien plus petit que la matrice d’adjacence en
N*N, mais l’accès aux données est a priori moins rapide (parcours de
liste, au lieu d’un accès calculé).
Plusieurs représentations sont possibles pour la liste de successeurs : tableau,
ensemble, liste chaînée... Voici un exemple utilisant deux tableaux:
Un tableau S indicé par les sommets et un tableau D de destinations d’arcs;
Une entrée i du tableau S "pointe" à un endroit de D par un indice, on trouve
successivement à cet endroit les sommets destinations de tous les arcs issus du
sommet i;
Cette séquence de sommets destinations s’arrête à l’endroit "pointé" par l’entrée
i + 1 du tableau S (il faut donc une entrée supplémentaire dans le tableau S pour
indiquer la fin des destinations du dernier sommet.)
Cette représentation indicée permet de déplacer facilement la liste en mémoire
(copie), ce qui ne serait pas le cas avec des pointeurs.
()
Graphes et algorithmes
13 / 82
x1
u1
u2
x2
u4
u3
x3
ind. Tab. S
1
1
3
2
5
3
5
4
Tab. D ind.
2
1
3
2
3
1
3
4
5
arcs
u2
u3
u1
u4
Notes:
La cellule grisée dans le tableau de pointeurs doit être allouée;
Par contre la cellule hachurée de la liste de destinations n’a pas besoin
d’être allouée;
les indices et les arcs sont des commentaires et ne font pas partie
explicitement de la représentation.
La complexité mémoire d’un graphe d’ordre N et de taille M est ici
exactement : (N+1)+M.
()
Graphes et algorithmes
14 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
15 / 82
Préparation aux TPs – Méthodologie
Objectif: implanter les algos de base de traitement de graphes en suivant la
méthodologie “Développement piloté par les tests”
sont fournis ici : un fichier d’ébauches (stubs) et des fichiers de tests.
l’objectif est de compléter l’ébauche pour passer les tests.
graphe.hpp:
stubs
code fn1
code fn1+fn2
inclusion
fichier test .h
inclusion
runtest .cc
compilation: make test
exécutable: runtest
()
Graphes et algorithmes
./runtest
16 / 82
Préparation aux TPs – Méthodologie, Compléments C++
un makefile est fourni pour simplifier la compilation: make test1; ./runtest
le TP utilisera les types C++ vector, map, set, et pair ; donc inclure <vector>,
<map>, <set>, et <utility> (pour pair)
vous utiliserez une version de C++ au moins ISO 2011 (-std=c++11 pour le
compilateur g++).
# include < vector >
# include < algorithm >
vector <int > v(1 , 12) ; // tableau 1 élé ment init . à 12
v. push_back (3) ; // ajoute 3 en fin : v = [12 , 3]
auto it = find (v. begin () ,v. end () , 12) ; // recherche d ’élé ment
if ( it != v. end () ) // alors it ‘‘ pointe ’’ sur l ’élé ment
cout << * it << endl ; // sort 12
// utilisation comme une pile
if (! v. empty () ) // non vide ?
cout << v. back () << endl ; // sort le dernier : 3
v. pop_back () ; // retire le dernier
cout << v. back () << endl ; // sort 12
()
Graphes et algorithmes
17 / 82
Préparation aux TPs – Compléments C++
# include < utility >
# include <map >
# include <set >
pair <int ,int > p;
p = pair <int ,int >{0 ,1};
cout << p. first << ", " << p. second << endl ;
map < string , float > m;
m [" PI "] = 3.14159; // cr ée une entr ée dans la map
cout << m [" PI "] << " ou bien " << m. at (" PI ") << endl ;
for ( auto x: m) // parcours des paires { cl é , valeur } de m
cout << x. first << " = " << x. second << endl ; // sort PI = 3.14159
set <int > s;
s. insert (1) ;
s. insert (2) ;
for ( auto x: s)
cout << x << endl ; // sort 1 et 2
cout << (s. find (1) != s. end () ) << ", " << (s. find (45) != s. end () )
<< endl ; // sort 1, 0 (1 dans s ? vrai ; 45 dans s ? faux )
()
Graphes et algorithmes
18 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
19 / 82
Notions non orientées
Un graphe G = (X , U ) est composé:
d’un ensemble X = {x1 , x2 , . . . , xn } de sommets ou noeuds;
d’un ensemble U = {u1 , u2 , . . . , um } et tel que U ⊂ X × X dont les
éléments sont appelés arêtes:
I une arête u = {xi , xj } est une paire non ordonnée de sommets;
I u = {x , x } est dite incidente aux sommets x et x , qui sont ses extrémités;
i j
i
j
I on appelle boucle une arête u = {x , x };
i i
on parle de multigraphe s’il existe plusieurs arêtes entre deux sommets;
un graphe est simple s’il n’est pas un multi-graphe et s’il n’y a pas de
boucles.
x1
x3
x2
()
A
B
C
x4
D
un multigraphe
un graphe simple
Graphes et algorithmes
20 / 82
Notions orientées
Dans un graphe orienté, un sommet xi peut être en relation avec un sommet xj
sans que la réciproque soit vraie. On note toujours G = (X , U ) mais:
les éléments de U sont appelés arcs et sont des couples ordonnés,
représentés par des flêches. On a: (xi , xj ) 6= (xj , xi ):
soit un arc u = (xi , xj ), alors xi est l’extrémité initale ou origine de l’arc et
xj est l’extrémité finale ou destination;
un p-graphe ne contient jamais plus de p arcs entre 2 sommets (xi , xj );
la densité d’un 1-graphe est le rapport m/n2 du nombre réel d’arcs sur le
nombre maximal possible.
x1
x2
x1
x3
un 2-graphe orienté
()
x2
x3
un 1-graphe orienté
Graphes et algorithmes
21 / 82
Notions orientées – 2
soit un arc u = (xi , xj ), alors xi est prédécesseur de xj , et xj est
successeur de xi ;
on notera Γ(xi ) l’ensemble des successeurs de xi et Γ−1 (xi ) l’ensemble
de ses prédécesseurs;
si on considère Γ comme une application, alors la donnée de (X , Γ) suffit
à caractériser complètement le graphe: on l’utilisera dans la
représentation en liste d’adjacence.
x1
x3
x2
Γ(x1 ) = {x2 , x3 }, Γ(x2 ) = {x1 }, Γ(x3 ) = {x2 , x3 }
()
Graphes et algorithmes
22 / 82
Notion de degré
ordre d’un graphe = cardinal de X (noté aussi |X |);
taille d’un graphe = |U |;
Deux sommets sont adjacents s’ils sont joints par un arc/arête;
Deux arcs/arêtes sont adjacents s’ils ont une extrémité commune;
d + (xi ) est le demi-degré extérieur de xi : nombre d’arcs sortants de xi
(égal à |Γ(xi )| pour un 1-graphe);
d − (xi ) est le demi-degré intérieur de xi : nombre d’arcs entrants dans xi
(égal à |Γ−1 (xi )| pour un 1-graphe);
d (xi ) = d + (xi ) + d − (xi ) est le degré de xi ; dans le cas d’un graphe non
orienté, c’est le nombre d’arêtes incidentes à xi (note: une boucle
augmente de deux le degré).
()
Graphes et algorithmes
23 / 82
Autres définitions
Ḡ = (X , Ū ) est le graphe complémentaire de G = (X , U );
G = (X , Up ) avec Up ⊂ U est un graphe partiel de G = (X , U );
G = (Xs , Us ) avec Xs ⊂ X et Us = {(x , y ) ∈ U ∩ Xs × Xs } est un graphe
sous-graphe de G = (X , U );
graphe complet = ∀xi , xj ∈ X , (xi , xj ) 6∈ U ⇒ (xj , xi ) ∈ U;
clique : ensemble des sommets d’un sous-graphe non orienté complet;
stable : ensemble de sommets non adjacents deux à deux,
∀x , y ∈ X , (x , y ) 6∈ U et (y , x ) 6∈ U;
graphe valué : on associe une valeur à chaque arc/arête (ex: distance
kilométrique pour un graphe représentant une carte routière)
()
Graphes et algorithmes
24 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
25 / 82
Exploration d’un graphe
x0
x1
x2
x3
x4
x5
x6
x7
x8
On considère dans la suite qu’on veut explorer un graphe en partant d’un
sommet donné, et en suivant les arcs/arêtes.
L’idée est de mémoriser les sommets déjà vus pour éviter de les visiter à
nouveau et de boucler dans le graphe (voir aussi plus loin dans le cours:
on évite les cycles / circuits, donc on parcours le graphe comme un
ensemble d’arbres / arborescences).
Les deux explorations de base sont:
I
I
Exploration en profondeur d’abord
Exploration en largeur d’abord
()
Graphes et algorithmes
26 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
()
x1
x2
x3
x4
x5
x6
x7
x8
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
ordre de parcours: x0 , x1 , x2 , x4 , x5 , x6 , x3 , x7 , x8 .
()
Graphes et algorithmes
27 / 82
Parcours en profondeur d’abord
Principe:
I
I
I
c’est une approche récursive;
on traite un noeud puis récursivement, on traite successivement chacun
des successeurs non encore traité;
les successeurs sont donc examinés dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
le parcours dessine un ensemble d’arbres: une forêt.
()
Graphes et algorithmes
27 / 82
Parcours en profondeur algo PP(G)
vecteurs état , pere , date_deb , date_fin ; // dimension = nb sommets
ParcoursProfondeur ( Graphe G) {
pour tout v ∈ sommet (G) faire
é tat (v) ← INCONNU
pere (v) ← NULL
entier temps ← 0
pour tout v ∈ sommet (G) faire
si é tat (v) = INCONNU alors
VisiterParcoursProfondeur (v , temps )
retourner père , date_deb , date_fin
}
VisiterParcoursProfondeur ( sommet v , entier & temps ) {
date_deb (v) ← ( temps ← temps + 1)
é tat (v) ← EN_COURS
pour tout w ∈ Successeurs (v) faire
si é tat (w) = INCONNU alors
pere (w) ← v
VisiterParcoursProfondeur (w , temps )
é tat (v) ← FAIT
date_fin (v) ← ( temps ← temps + 1)
}
()
Graphes et algorithmes
28 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = {x0 }
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = 0/
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = {x1 }
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = {x2 ,x4 }
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = {x4 ,x5 }
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = {x5 ,x7 }
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = {x7 ,x6 }
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = {x6 ,x8 }
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = {x8 ,x3 }
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = {x3 }
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
File = 0/
()
Graphes et algorithmes
29 / 82
Parcours en largeur d’abord
Principe:
I
I
I
c’est une approche itérative qui utilise une file (FIFO "First In First Out");
on traite un noeud puis ses successeurs non encore traités sont mis en
bout de file;
les successeurs sont donc mis dans la file dans un certain ordre: nous
considérons que les sommets sont toujours numérotés, et que l’ordre est
l’ordre croissant des numéros;
x0
x1
x2
x3
x4
x5
x6
x7
x8
Ordre de parcours = x0 , x1 , x2 , x4 , x5 , x7 , x6 , x8 , x3 .
()
Graphes et algorithmes
29 / 82
Parcours en largeur algo PL(G)
vecteurs état , pere , date ; // dimension = nb sommets
ParcoursLargeur ( Graphe G) {
pour tout v ∈ sommet (G) faire
é tat (v) ← INCONNU
pere (v) ← NULL
entier temps ← 0
pour tout v ∈ sommet (G) faire
si é tat (v) = INCONNU alors
VisiterParcoursLargeur (v , temps )
retourner père , date
}
VisiterParcoursLargeur ( sommet v , entier & temps ) {
é tat (v) = EN_COURS
File F = {v}
tant que F non vide faire
courant ← F.dé filer ()
date ( courant ) ← ( temps ← temps + 1)
é tat ( courant ) ← FAIT
pour tout w ∈ Successeurs ( courant ) faire
si é tat (w) = INCONNU alors
é tat (w) = EN_COURS
pere (w) ← courant
F. enfiler (w)
}
()
Graphes et algorithmes
30 / 82
Note sur le parcours en profondeur
Le parcours en profondeur peut aussi être implanté par un algo similaire à
celui du parcours en largeur, où la file FIFO est simplement remplacée par
une pile LIFO "Last In First Out".
En fait l’appel récursif de l’algo profondeur vu plus haut utilise
implicitement une pile : la pile de retour d’appels de fonctions (call stack ).
()
Graphes et algorithmes
31 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
32 / 82
Parcours
x1
x2
x3
x4
x5
x6
x7
x8
Une chaîne est une séquence d’arêtes où chacune a une extrémité
commune avec la précédente: {x8 , x5 }{x5 , x4 }{x4 , x7 }{x7 , x5 }{x5 , x4 }
Un cycle est une chaîne où les arêtes sont distinctes et la dernière arête
est incidente avec la première: {x8 , x5 }{x5 , x7 }{x7 , x8 }
Un chemin est une chaîne orientée: (x8 , x5 )(x5 , x6 )(x6 , x3 )(x3 , x5 )
Un circuit est un cycle orienté: (x5 , x6 )(x6 , x3 )(x3 , x5 )
Plus généralement, on appelle parcours soit une chaîne, soit un cycle, soit un
chemin, soit un circuit.
()
Graphes et algorithmes
33 / 82
Parcours particuliers, connexité
Un parcours est dit:
élémentaire : tous ses sommets sont distincts
simple : tous ses arcs/arêtes sont distincts
hamiltonien : il traverse une et une seule fois tous les sommets du graphe
eulérien : il passe une et une seule fois par tous les arcs/arêtes du graphe
Un graphe est dit:
connexe si quelque soient 2 sommets x et y, alors il existe une chaîne
entre x et y (visuellement, il est "en un seul morceau").
On appelle composante connexe (CC) un sous-ensemble maximal de
sommets tel qu’il existe une chaîne entre 2 quelconques d’entre eux (on
ne peut pas lui ajouter un sommet sans perdre la connexité).
Note : un graphe connexe comporte une et une seule CC.
()
Graphes et algorithmes
34 / 82
Algorithme de vérification de la connexité
Soit G = {X , U } non orienté
Choisir un sommet quelconque x ∈ X
Appliquer un algorithme de parcours/exploration : soit en profondeur
d’abord, soit en largeur d’abord, à partir de x, en comptant le nombre N
de sommets explorés.
Le graphe G = {X , U } est connexe si et seulement si N = Card (X ).
()
Graphes et algorithmes
35 / 82
Forte connexité, CFC
Un graphe est dit:
fortement connexe si quelque soient 2 sommets x et y, alors il existe une
chemin (donc orienté) entre x et y. Formellement, soit G = (X , U ),
∀x , y ∈ X , alors ∃x →∗G y et y →∗G x (où →∗G indique un chemin
quelconque dans G).
On appelle composante fortement connexe (CFC) un sous-ensemble
maximal de sommets tel qu’il existe une chemin entre 2 quelconques
d’entre eux (on ne peut pas lui ajouter un sommet sans perdre la forte
connexité).
Note : un graphe fortement connexe comporte une et une seule CFC.
()
Graphes et algorithmes
36 / 82
Algorithme naïf de recherche de CFC
tant qu ’ il y a un sommet non attribu é à une CFC
marquer ce sommet avec + et tant qu ’ il y a un sommet dont le pr édé cesseur est marqu é +
marquer ce sommet +
tant qu ’ il y a un sommet dont le successeur est marqu é marquer ce sommet attribuer tous les sommets marqu és + et - à la mê me nouvelle CFC
retirer du graphe les sommets de cette CFC
nettoyer les marques + ou - des sommets restants
()
Graphes et algorithmes
37 / 82
Algorithme de Tarjan sur les CFC
L’algorithme de Tarjan est un parcours en profondeur d’abord, qui utilise une
mémorisation de la date de 1er accès à un sommet, puis à ses successeurs
pour identifier les CFCs.
entr ée: graphe G = (X , U); sortie : affichage CFCs
index := 0 // var globale !
S := pile vide // var globale !
pour tout sommet x dans X
si (x. index non dé fini ) alors
chercheCFC (x)
finsi
finpour
()
Graphes et algorithmes
38 / 82
Algorithme de Tarjan sur les CFC
fonction chercheCFC (x)
x. index := index
x. dateMin := index
index := index + 1
S. empiler (x)
x. estDansPile := vrai
pour chaque (x , y) arc dans U // les successeurs de x
si (y. index non dé fini ) alors // 1è re visite
chercheCFC (y) // ré cursion du parcours profondeur
x. dateMin := min (x. dateMin , y. dateMin )
sinon si (y. estDansPile ) alors // dans la CFC de x
x. dateMin := min (x. dateMin , y. index )
finsi
finpour
si (x. dateMin = x. index ) alors // c ’ est une nlle CFC
faire
w := S.dé piler ()
w. estDansPile := faux
ajoute w à la CFC courante
tant que (w != x)
finsi
sortir CFC courante
()
Graphes et algorithmes
39 / 82
Exemple algo Tarjan
{0}
x1
x1
x2
{0}
x2
x3
{0}
x4
x5
x4
x6
{3}
{6}
x5
x7
x8
{3}
x6
x7
{7}
x8
{3}
x3
Figure: Graphe à gauche, et représentation du parcours du graphe par l’algo. de
Tarjan à doite
les valeurs finale de DateMin sont entre accolades;
les arcs en gras correspondent aux nouveaux noeuds inserés sur la pile;
les arcs fins correspondent au cas où le noeud exploré est déjà dans la pile;
les arcs pointillés au cas où l’index du noeud exploré est déjà défini, mais le sommet n’est plus dans la pile.
()
Graphes et algorithmes
40 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
41 / 82
Graphes particuliers
Graphe planaire (orienté ou pas) : peut être dessiné sur un plan (ou une
sphère) sans croisement d’arcs. Tous les graphes d’ordre ≤ 4 sont
planaires. Un graphe est planaire si il ne fait pas apparaître :
I
I
5 sommets, tous reliés 2 à 2 par une chaîne (pentagramme)
2 groupes de 3 sommets, tels que chaque sommet d’un groupe est
connecté par une chaîne à chaque sommet de l’autre groupe (problème
des 3 clients et des 3 fournisseurs).
x1
x5
x2
x4
x3
x1
x4
x2
x5
x3
x6
Figure: Motifs “interdits” (impossibles) dans un graphe planaire.
()
Graphes et algorithmes
42 / 82
Graphes Particuliers – 2
Graphe simple orienté sans circuit : ses sommets peuvent être
partitionnés en niveaux, tels que tout sommet de niveau N+1 a au moins
un prédécesseur au niveau N (avec N≥ 0), et aucun aux niveaux ≥ N.
x2
x4
x5
x1
x3
Niveau 0
Niveau 1
x6
Niveau 2
Niveau 3
Idée d’algorithme : poser N = 0, chercher tous les sommets sans
prédécesseurs, les affecter au niveau N et les retirer du graphe, puis
recommencer jusqu’à épuisement des sommets.
()
Graphes et algorithmes
43 / 82
Graphes Particuliers – 3
Un arbre est un graphe non orienté, connexe, sans cycle. Un arbre à N
sommets contient (N-1) arêtes.
Une forêt est un graphe non orienté, sans cycle (pas forcément connexe).
Chaque composante connexe d’une forêt est un arbre.
Figure: Forêt à 3 CC.
x4
x2
x5
x6
x1
x7
x8
x9
x3
()
Graphes et algorithmes
44 / 82
Graphes Particuliers – 4
Une arborescence est un graphe orienté où chaque sommet a un seul
prédécesseur, sauf le sommet racine de l’arborescence. Pour chaque
sommet il existe un seul chemin de la racine a ce sommet.
Note : on emploie souvent aussi le terme “arbre” dans le cas orienté
(donc arborescence)... C’est notamment le cas en anglais: oriented tree.
Une arborescence est donc un graphe orienté sans circuit et connexe.
Soit une arborescence A de racine r, un sommet x et un autre sommet y
sur le chemin de r à x :
I
I
I
I
I
I
y est un ancêtre de x et x un descendant;
∗
∗
si 6 ∃ z , y → z → x alors y est le père de x et x un fils de y;
deux noeuds de même père sont frères;
un noeud sans fils est une feuille;
le nombre d’arcs sur le chemin de r à x est la profondeur de x;
la plus grande profondeur existante dans A est la hauteur de A;
()
Graphes et algorithmes
45 / 82
Graphes Particuliers – 5
Un graphe est eulérien s’il possède un cycle eulérien.
I
I
un graphe est eulérien si tous ses sommets sont de degré pair;
un graphe possède un parcours eulérien, non cyclique, si il possède
exactement 2 sommets de degré impair. Ce parcours relie ces 2 sommets.
Un isthme est un arc/arête telle que sa suppression coupe une
composante (fortement) connexe en deux.
Un point d’articulation est sommet dont la suppression (avec les
arc/arêtes adjacents) coupe une composante (fortement) connexe en
deux.
Un graphe est hamiltonien s’il possède un cycle hamiltonien.
I
Un graphe hamiltonien ne possède ni isthme, ni point d’articulation.
()
Graphes et algorithmes
46 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
47 / 82
Énumération des circuits hamiltoniens (CH)
On va construire un arbre de choix sur les arcs (et non pas les sommets
comme dans les algos de parcours vu précédemment). À chaque noeud
de l’arbre de choix, un arc du graphe est soit conservé pour le CH, soit
éliminé.
I Cas où l’on conserve l’arc a = (i , j ) : on “contracte” l’arc en fusionnant les
I
I
I
2 sommets en un seul, d’étiquette “i,j” par exemple.
Puisqu’on cherche un CH, on supprime tous les arcs sortant de i (un seul
arc peut sortir de i, c’est a) et tous ceux entrant en j (même raisonnement).
Si dans la construction de l’arbre de choix on arrive sur une feuille (plus
d’arcs à choisir) et qu’on accède à cette feuille en contractant une boucle,
alors les étiquettes des branches de l’arbre de choix menant à cette feuille
forment un CH (si le dernier arc n’est pas une boucle cette branche est un
échec).
Cas où l’on supprime l’arc a = (i , j ) : si le graphe devient non connexe,
alors terminer cette branche qui est un échec. Si on atteint un feuille, c’est
aussi un échec.
()
Graphes et algorithmes
48 / 82
Énumération d’arbres couvrants (graphes non orientés)
Soit un graphe G, on veut un arbre couvrant qui soit un graphe partiel du
graphe de départ, c’est à dire qui connecte tous les noeuds de en utilisant
uniquement des arêtes de G et qui soit sans cycle.
On va construire un arbre de choix sur les arcs. À chaque noeud de
l’arbre de choix, une arête du graphe est soit conservée pour l’arbre
couvrant résultat, soit éliminée.
I Cas où l’on conserve l’arête a = (i , j ) : a ne doit pas être une boucle,
I
I
alors on “contracte” a en fusionnant les 2 sommets en un seul, d’étiquette
“i,j” par exemple; sinon la branche est un échec.
Quand tous les sommets sont fusionnés, on est sur une feuille de l’arbre de
choix (même s’il reste des arêtes), l’étiquette de la branche qui mène à
cette feuille donne les arêtes de l’arbre couvrant résultat.
Cas où l’on supprime l’arête a = (i , j ) : si le graphe devient non connexe,
alors terminer cette branche qui est un échec.
()
Graphes et algorithmes
49 / 82
Arbre couvrant de poids minimum
Pour certains problèmes de construction de réseau de distribution, on
souhaite connecter tous les points d’un graphe valué, de telle sorte que le
coûts des arcs utilisés soit minimum.
La liste des arcs utilisés correspond forcément à un arbre (si il y a un
cycle, on peut supprimer un arc sans changer la connexité, et le coût est
moindre) : on parle d’arbre couvrant de poids minimum.
Par exemple dans le cas d’un réseau d’acheminement électrique, le coût
est approximativement proportionnel à la longueur des lignes et on doit
connecter tous les sommets du réseau (domiciles, entreprises, ...) : on
cherche un arbre couvrant de poids minimum (minimum spanning tree).
Les 2 algorithmes les plus simples sont Kruskal, qui construit un arbre
couvrant minimal ou une forêt couvrante minimale si le graphe n’est pas
connexe, et Prim, qui doit être itéré sur chaque composante connexe
lorsque le graphe ne l’est pas.
()
Graphes et algorithmes
50 / 82
Algorithme de Kruskal
Kruskal (G) // G : graphe
L ← {} // liste d ’ ensemble de sommets , fusionn és ou pas
pour tout sommet s de G faire
L ← L ∪ {{ v }}
fin pour
trier les arcs de G par longueur croissante { a0 , . . . , am−1 }
i ← 0 // indice prochain arc examin é
Arbre ← {}
tant que | Arbre | < n - 1 faire
soit ai = (u , v ) // prochaine plus courte ar ê te
trouver Lu ∈ L tel que u ∈ Lu // ensemble de sommets avec u
trouver Lv ∈ L tel que v ∈ Lv // idem pour v
si Lu 6= Lv alors // u et v pas dans mê me fusion => pas de cycle
Arbre ← Arbre ∪ { ai }
retirer Lu et Lv de L // fusion é tape 1
ajouter { Lu ∪ Lv } dans L // fusion é tape 2
fin si
i ← i +1
fin tant que
retourner Arbre
fin
()
Graphes et algorithmes
51 / 82
Algorithme de Prim
Principe :
I
I
On part d’un arbre résultat initial A réduit à un seul sommet s quelconque
du graphe de départ G;
tant que A contient moins de (n − 1) arêtes avec n le nombre de sommets
de G:
F
()
ajouter une arête à A en connectant A au plus proche (au sens des longueurs
d’arcs) sommet "libre" (pas dans A, et ne créant pas un cycle avec A).
Graphes et algorithmes
52 / 82
Algorithme de Prim – Exemple
a
7
8
b
5
c
7
5
9
15
d
e
9
6
8
f
11
g
Algorithme de Prim – Exemple
a
7
8
b
5
c
7
5
9
15
d
e
9
6
8
f
()
Graphes et algorithmes
11
g
53 / 82
Algorithme de Prim – Exemple
a
7
8
b
5
c
7
5
9
15
d
e
9
6
8
f
()
Graphes et algorithmes
11
g
53 / 82
Algorithme de Prim – Exemple
a
7
8
b
5
c
7
5
9
15
d
e
9
6
8
f
()
Graphes et algorithmes
11
g
53 / 82
Algorithme de Prim – Exemple
a
7
8
b
5
c
7
5
9
15
d
e
9
6
8
f
()
Graphes et algorithmes
11
g
53 / 82
Algorithme de Prim – Exemple
a
7
8
b
5
c
7
5
9
15
d
e
9
6
8
f
()
Graphes et algorithmes
11
g
53 / 82
Algorithme de Prim – Exemple
a
7
8
b
5
c
7
5
9
15
d
e
9
6
8
f
()
Graphes et algorithmes
11
g
53 / 82
Graphes PERT
PERT : Program Evaluation and Review Technique
Technique de suivi de projet modélisé en graphe
But: éviter les retards, déteminer les tâches critiques
Origines : 1957, programme américain Polaris; 1968, J.O. de Grenoble
Principe :
I
I
certaines tâches doivent attendre la complétion d’autres tâches : on ne
peut pas bâtir le toit d’une maison sans les murs,
certaines tâches peuvent s’exécuter en parallèle : le cablage éléctrique
peut se faire en parallèle de la pose des fenêtres.
Une tâche courte en parallèle d’une tâche longue peut démarrer + ou tard, on définit:
I
I
I
I
date de départ au + tôt et au + tard
date de fin au + tôt et au + tard
la marge est la différence (départ au + tard) - (départ au + tôt) (ou calculée
identiquement sur les dates de fin) = décalage permis sans retarder tout
une tâche critique a une marge nulle
()
Graphes et algorithmes
54 / 82
Graphes PERT – Exemple (1)
Exemple :
Tâche
A
B
C
D
E
F
G
Prédec.
Temps
4
5
5
6
5
4
5
∅
∅
A
A
B, C
D
E
D
A
Init
F
Fin
C
B
G
E
()
Graphes et algorithmes
55 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
?
?
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
?
?
?
?
?
?
4
F
?
?
?
?
?
()
?
?
?
?
5
B
?
?
?
0
?
6
D
?
?
4
E
?
?
?
5
G
?
0
Fin
0
?
?
?
?
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
?
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
?
?
?
?
?
?
4
F
?
?
?
?
?
()
?
?
?
?
5
B
?
?
?
0
?
6
D
?
4
4
E
?
?
?
5
G
?
0
Fin
0
?
?
?
?
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
?
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
?
?
?
?
5
?
4
F
?
?
?
?
?
()
?
?
?
?
5
B
?
?
?
0
0
6
D
?
4
4
E
?
?
?
5
G
?
0
Fin
0
?
?
?
?
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
?
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
?
?
?
?
5
?
4
F
?
9
?
?
?
()
?
?
?
4
5
B
?
?
?
0
0
6
D
?
4
4
E
?
?
?
5
G
?
0
Fin
0
?
?
?
?
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
?
?
?
?
5
?
4
F
?
9
?
?
?
()
?
?
?
4
5
B
?
10
?
0
0
6
D
?
4
4
E
?
?
?
5
G
?
0
Fin
0
?
?
?
?
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
4
F
?
?
?
?
?
?
9
?
9
5
?
()
?
?
?
4
5
B
?
10
?
0
0
6
D
?
4
4
E
?
13
?
5
G
?
0
Fin
0
?
?
?
?
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
4
F
?
?
?
?
?
?
9
14
9
5
?
()
10
?
?
4
5
B
?
10
?
0
0
6
D
?
4
4
E
?
13
?
5
G
?
0
Fin
0
?
?
?
?
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
4
F
?
?
?
?
?
13
9
14
9
5
?
()
10
?
?
4
5
B
?
10
?
0
0
6
D
?
4
4
E
?
13
?
5
G
?
0
Fin
0
?
?
18
?
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
4
F
?
?
18
?
?
13
9
14
9
5
?
()
10
?
?
4
5
B
?
10
?
0
0
6
D
?
4
4
E
?
13
?
5
G
?
0
Fin
0
18
?
18
?
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
4
F
?
?
18
?
18
13
9
14
9
5
?
()
10
?
?
4
5
B
?
10
?
0
0
6
D
?
4
4
E
?
13
?
5
G
?
0
Fin
0
18
18
18
?
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
4
F
?
?
18
?
18
13
9
14
9
5
?
()
10
?
?
4
5
B
?
10
?
0
0
6
D
?
4
4
E
?
13
13
5
G
0
0
Fin
0
18
18
18
18
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
4
F
4
18
18
?
18
13
9
14
9
5
?
()
10
?
14
4
5
B
?
10
?
0
0
6
D
?
4
4
E
?
13
13
5
G
0
0
Fin
0
18
18
18
18
?
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
?
0
?
?
5
C
?
?
4
F
4
18
18
?
18
13
9
14
9
5
9
()
10
?
14
4
5
B
?
10
?
0
0
6
D
?
4
4
E
0
13
13
5
G
0
0
Fin
0
18
18
18
18
13
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
8
0
?
?
5
C
?
?
4
F
4
18
18
?
18
13
9
14
9
5
9
()
10
14
14
4
5
B
?
10
?
0
0
6
D
4
4
4
E
0
13
13
5
G
0
0
Fin
0
18
18
18
18
13
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
8
0
4
?
5
C
0
?
4
F
4
18
18
9
18
13
9
14
9
5
9
()
10
14
14
4
5
B
?
10
?
0
0
6
D
4
4
4
E
0
13
13
5
G
0
0
Fin
0
18
18
18
18
13
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
?
0
0
0
Init
0
4
A
?
8
0
4
4
5
C
0
9
4
F
4
18
18
9
18
13
9
14
9
5
9
()
10
14
14
4
5
B
4
10
?
0
0
6
D
4
4
4
E
0
13
13
5
G
0
0
Fin
0
18
18
18
18
13
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
0
0
0
0
Init
0
4
A
0
8
0
4
4
5
C
0
9
4
F
4
18
18
9
18
13
9
14
9
5
9
()
10
14
14
4
5
B
4
10
4
0
0
6
D
4
4
4
E
0
13
13
5
G
0
0
Fin
0
18
18
18
18
13
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
0
0
0
0
Init
0
4
A
0
8
0
4
4
5
C
0
9
4
F
4
18
18
9
18
13
9
14
9
5
9
()
10
14
14
4
5
B
4
10
4
0
0
6
D
4
4
4
E
0
13
13
5
G
0
0
Fin
0
18
18
18
18
13
Graphes et algorithmes
56 / 82
Graphes PERT – Exemple (2)
Diagramme “activité sur les noeuds”
départ +tôt
durée
fin +tôt
Tâche (ou Activité)
départ +tard
marge
fin +tard
départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej )
fin+tardi = minj ∈succ (i ) (fin+tardj -duréej )
margei = fin+tardi – fin+tôti
4
0
0
0
0
0
Init
0
4
A
0
8
0
4
4
10
5
C
0
9
18
18
9
18
13
9
14
9
5
9
4
F
4
14
14
4
5
B
4
10
4
0
0
6
D
4
4
4
E
0
13
13
5
G
0
0
Fin
0
18
18
18
18
13
chemin critique: chemin avec marge nulle (il peut y en avoir plusieurs)
()
Graphes et algorithmes
56 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
57 / 82
Plus courts chemins
Soit un graphe valué, c’est à dire qu’on associe à chaque arc/arête une
valeur, appelée longueur ou coût.
Soit un chemin (x1 , x2 )(x2 , x3 ) . . . (xn−1 , xn ), la longueur du chemin est
égale à l (x1 , x2 ) + l (x2 , x3 ) + . . . + l (xn−1 , xn ) où l (xi , xj ) est la longueur
de l’arc (xi , xj ).
La recherche d’un plus court chemin entre les sommet x et y est la
recherche d’un chemin de longueur minimale entre ces 2 sommets (il peut
y avoir plusieurs chemins minimaux de mêmes coûts).
Applications : transport (navigation GPS), planification (coûts/temps
d’investissements...)
Principe d’optimalité : tout sous-chemin d’un chemin minimal est lui même
minimal (utilisé dans certains algos).
Un circuit absorbant est un circuit de longueur < 0. En présence d’un
circuit absorbant, il n’y a plus de notion de plus court chemin : en effet
chaque tour de circuit diminuerait sa longueur, la faisant tendre vers −∞
()
Graphes et algorithmes
58 / 82
Plus courts chemins– Dijkstra–Moore
L’algorithme de Dijkstra–Moore est très efficace mais utilisable seulement si
les longueurs d’arcs sont ≥ 0.
Les sommets sont modélisés par des entiers positifs consécutifs (ex : [0, n-1])
algo DM ( graphe (G ,l) , entier d , entier t)
// l : fonct . longueur ; d : sommet dé part ; t: sommet terminal
dist : tableau numerique
// dist [i] = + courte distance connue entre dep et i
pred : tableau numerique
// pred [i] = predecesseur de i sur + court chemin connu
marq : tableau booleen
// marq (i) = vrai si déjà trait é ( donc à ignorer )
pour i dans les indices de sommets faire
dist [i] = ∞ // c.à.d. injoignable ( pour l ’ instant )
pred [i] = ∅ // pas encore trouv é
marq [i] = faux // pas trait é
fin pour
(... suite page suivante ...)
()
Graphes et algorithmes
59 / 82
Plus courts chemins– Dijkstra–Moore (2)
dist [d] = 0
marq [d] = vrai
courant = d
tant que marq [t] == faux faire
pour chaque successeur s de courant faire
si marq [s] == faux et dist [s] > dist [ courant ] + l( courant ,s)
alors
dist [s] = dist [ courant ] + l( courant ,s)
prec [s] = courant ;
fin si
fin pour
trouver le sommet n tel que :
marq [n] = faux
dist [n] est minimale
fin trouver
courant = n
marq [ courant ] = vrai
fin tant que
retourner dist et pred
fin
()
Graphes et algorithmes
60 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
o
d
1
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
o
d
1
o
d
5
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
o
d
1
3
o
d
5
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
o
d
1
3
o
d
5
o
x2
7
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
o
d
1
3
o
d
5
o
x2
7
o
x2
16
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
3
o
d
1
3
o
d
5
x1
4
o
o
x2
7
o
x2
16
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
3
o
d
1
3
o
d
5
x1
4
o
3
o
x2
7
o
x2
16
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
3
o
d
1
3
o
d
5
x1
4
o
3
o
x2
7
x3
6
o
o
x2
16
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
3
o
d
1
3
o
d
5
x1
4
o
3
o
x2
7
x3
6
o
o
x2
16
x3
9
o
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
x3
5
3
5
d
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
3
o
d
1
3
o
d
5
x1
4
o
3
o
x2
7
x3
6
o
3
o
x2
16
x3
9
o
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
5
3
d
x3
5
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
3
o
d
1
3
o
d
5
x1
4
o
3
o
x2
7
x3
6
o
3
o
x2
16
x3
9
x4
8
o
o
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
5
3
d
x3
5
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
3
o
d
1
3
o
d
5
x1
4
o
3
o
x2
7
x3
6
o
3
o
x2
16
x3
9
x4
8
o
o
3
o
61 / 82
Illustration Dijkstra–Moore
d
2
x1
5
3
d
x3
5
1
1
x1
t
2 3
15
1
x2
2
x2
6
x4
x3
plus court chemin :
remonter les prédecesseurs
d ← x2 ← x1 ← x3 ← x4 ← t
longueur = 8
x4
t
()
Graphes et algorithmes
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
prec
dist
marq
∅
0
3
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
∅
∞
o
d
3
x2
2
o
3
o
d
1
3
o
d
5
x1
4
o
3
o
x2
7
x3
6
o
3
o
x2
16
x3
9
x4
8
o
o
3
o
61 / 82
Plus courts chemins– Bellman–Ford
L’algorithme de Bellman–Ford est moins efficace que celui de Dijkstra–Moore,
en temps d’exécution, mais il est utilisable quand les longueurs d’arcs peuvent
être négatives (et peut détecter un circuit absorbant).
Les sommets sont modélisés par des entiers positifs consécutifs (ex : [0, n-1])
algo BF ( graphe (G ,l) , entier d)
// l : fonct . longueur ; d : sommet dé part
dist : tableau numerique
// dist [i] : + courte distance connue entre dep et i
pred : tableau numerique
// pred [i] : predecesseur de i sur + court chemin connu
pour i dans les indices de sommets faire
if i == d
dist [i] ← 0
else
dist [i] ← ∞ // c.à.d. injoignable ( pour l ’ instant )
pred [i] ← ∅ // pas encore trouv é
fin pour
entier cpt ← 0
// compteur de boucles
bool é en fini ← faux
// vrai si calcul termin é
(... suite page suivante ...)
()
Graphes et algorithmes
62 / 82
Plus courts chemins– Bellman–Ford (2)
répé ter
fini ← vrai
pour tout sommet j 6= d
pour tout sommet i ∈ pr édé cesseurs (j)
si dist [j] > dist [i] + l(i ,j) alors
dist [j] ← dist [i] + l(i ,j)
pred (j) ← i
fini ← faux // modification à propager
cpt ← cpt +1 // tous les sommets ont propag é
jusqu ’à fini = VRAI ou cpt > n -1 // tous sommets
si cpt > n -1 alors
signaler circuit absorbant
sinon
retourner dist et pred
()
Graphes et algorithmes
63 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
T
1
2
6
B
1) Initialisation
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
1
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
T
1
2
6
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
2
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
3
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
T
1
2
6
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
4
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
5
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
6
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
B
10
7
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
8
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
C
11
9
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
10
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
T
1
2
6
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
11
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
3
o
12
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
3
o
13
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
3
o
C
3
14
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
3
o
C
3
3
o
15
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
3
o
C
3
3
o
B
7
16
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
3
o
C
3
3
o
B
7
17
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
3
o
C
3
3
o
B
7
18
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
3
o
C
3
3
o
B
7
D
9
19
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Bellman–Ford (3)
3
A
C
4
4
−4
9
S
S
1
6
T
2
B
4
D
plus court chemin :
remonter les prédecesseurs
S←A←C←B←D←T
longueur = 9
A
B
C
D
T
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
prec
dist
∅
0
∅
∞
∅
∞
∅
∞
∅
∞
∅
∞
S
4
S
6
A
7
BC
8
10
CD
10
11
3
o
3
o
C
3
3
o
3
o
3
o
B
7
D
9
3
o
3
o
20
()
Graphes et algorithmes
64 / 82
Plus courts chemins– Floyd–Warshall
L’algorithme de Floyd–Warshall calcule la plus courte distance pour chaque paire de
sommet. Il est basé sur une forme matricielle proche de la matrice d’adjacence. Le
principe est vu en cours d’Algèbre Linéaire, il est très proche de celui de Bellman–Ford
: seul l’algorithme est donné ici. Les sommets sont modélisés par des entiers positifs
consécutifs (ex : [0, n-1])
algo FW ( graphe ( MG ))
// MG : matrice d ’ adjacence du graphe , contenant longueur arcs
dist : tableau 2D numerique
// dist [i ][ j] : + courte distance connue entre i et j
pred : tableau 2D numerique
// pred [i ][ j] : pred . de j sur + court chemin connu depuis i
pour i dans les indices de sommets faire
pour j dans les indices de sommets faire
si i = j alors
dist [i ][ j] ← 0
dist [i ][ j] ← MG [i ][ j] // lg arc (∞ si pas d ’ arc )
si dist [i ][ j] != ∞
pred [i ][ j] ← i // meilleur pred é cesseur connu de i à j
sinon
pred [i ][ j] ← ∅ // pas encore connu
fin pour
fin pour (... suite page suivante ...)
()
Graphes et algorithmes
65 / 82
Plus courts chemins– Floyd–Warshall (2)
pour k dans les indices de sommets faire
pour i dans les indices de sommets faire
pour j dans les indices de sommets faire
si dist [i ][ k] + dist [k ][ j] < dist [i ][ j] alors
dist [i ][ j] = dist [i ][ k] + dist [k ][ j]
pred [i ][ j] = pred [k ][ j]
finsi
finpour
finpour
finpour
fin
()
Graphes et algorithmes
66 / 82
Plus courts chemins – Bilan
Complexité en temps de calcul au pire des cas
Dijkstra–Moore est en O (n2 )
Bellman-Ford et Floyd-Warshall sont en O (n3 )
Bilan
Si on veut un plus court chemin entre toutes les paires de sommets
quelconques, alors utiliser Floyd-Warshall.
Si on n’a qu’un seul point de départ, et des arcs de longueur négative,
alors utiliser Bellman-Ford
Dans les autres cas (arcs positifs ou nul, et point de départ unique) utiliser
Dijkstra–Moore qui est plus efficace.
()
Graphes et algorithmes
67 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
68 / 82
Réseaux et Flots
Un réseau de transport est un graphe G = (X , U ) connexe, sans boucle,
asymétrique avec une entrée s, la source,et une sortie t, le puits, tous
deux dans X , et tel que chaque arc ui ∈ U, avec i ∈ [0, m − 1] est associé
à une capacité ci (quantité transportée maximale pouvant circuler sur
l’arc).
Un flot est un vecteur ligne f = (f0 , f1 , . . . , fm−1 ) tel que :
I
I
I
I
chaque composante fi représente le flot (quantité effective circulant) sur
l’arc i;
toutes les composantes de f sont ≥ 0
le flot est censé arriver par le sommet s et disparaître par t
en tout sommet x, avec x 6∈ {s, t }, la loi de conservation de Kirchhoff est
vérifiée :
fi =
fj
∑
∑
i ∈arcs entrants de x
j ∈arcs sortants de x
(pour chaque sommet le flot entrant est égal au flot sortant).
Un flot est admissible si ∀i ∈ [0, m − 1], fi ≤ ci (sur chaque arc le flot est
au maximum égal à la capacité). Note: un flot nul (~0) est toujours
admissible.
()
Graphes et algorithmes
69 / 82
Graphe résiduel (ou graphe d’écart)
On définit le graphe ou réseau résiduel (ou d’écart) Gf = (X , Uf )
associé à:
I un réseau G = (X , U ) de capacité c
(x ,y ) sur l’arc (x , y )
I un flot admissible donné f , noté f
(x ,y ) sur l’arc (x , y )
pour tout arc (x , y ) de G, on trouve dans Gf
I un arc (x , y ) de capacité c (x , y ) = c
f
(x ,y ) − f(x ,y )
I un arc opposé (y , x ) de capacité c (y , x ) = f
f
(x ,y )
Note: par définition d’un flot admissible, on a c(x ,y ) > f(x ,y ) et donc
cf (x , y ) ≥ 0 pour tout arc(x , y ). Pour simplifier on ne note pas les arcs de
capacité nulle quand on représente le graphe résiduel.
On va chercher un chemin de la source au puits sur le graphe résiduel :
ce chemin d’incrémentation servira à modifier le flot courant pour le
maximiser.
()
Graphes et algorithmes
70 / 82
Illustration du graphe résiduel
B
10/0
s
B
t
5/5
5
10
5/5
s
5
t
5
10
10/5
10/10
5
C
C
graphe initial:
capacité / flot
graphe résiduel: capacité résiduelle
arcs même sens, sens opposé
Rappel: à chaque arc (x , y ) associé à c(x ,y ) et f(x ,y ) du réseau de départ
on associe dans le graphe résiduel (arcs nuls non dessinés):
• un arc de même sens (x , y ) de capacité résiduelle: c(x ,y ) − f(x ,y )
• un arc opposé (y , x ) de capacité résiduelle:
f(x ,y )
()
Graphes et algorithmes
71 / 82
Algo de Ford–Fulkerson / Edmonds–Karp
Principe :
I
I
Partir d’un flot admissible f existant (ou nul par défaut) sur le réseau
G = (X , U )
Itérer :
F
Ford–Fulkerson
Edmonds–Karp
F
F
F
→
→
Construire Gf (ou du moins être capable de donner la capacité résiduelle
cf (x , y ) pour chque arc (x , y ))
Trouver un chemin d’incrémentation p de s à t dans Gf , tel que cf (x , y ) > 0
pour tout arc (x , y ) de ce chemin p
Trouver un plus court chemin d’incrémentation p en nombre d’arcs de s à t
dans Gf , tel que cf (x , y ) > 0 pour tout arc (x , y ) de ce chemin p
Si pas de chemin, alors terminé
trouver la valeur cf (p) = Min{cf (x , y )|(x , y ) ∈ p} (minimum des capacités
résiduelles sur le chemin)
pour tout arc (x , y ) ∈ p changer le flot correspondant du réseau G:
si (x , y ) ∈ U alors f(x ,y ) = f(x ,y ) + cf (p) (incrément si arc dans le même sens
dans G et Gf )
si (y , x ) ∈ U alors f(x ,y ) = f(x ,y ) − cf (p) (décrément si arc en sens inverse
dans G et Gf )
la variante Ford–Fulkerson est plus efficace en temps de calcul mais ne
donne de résultats garantis que pour des flots et capacités entières.
()
Graphes et algorithmes
72 / 82
Illustration algo de Ford–Fulkerson / Edmonds–Karp
B
B
10/0
s 5/5
t
10
s
10/5
10
5/5
10/10
5
5
t
5
5
C
C
graphe initial:
capacité / flot
graphe résiduel: chemin en traits pleins,
cf (chemin) = 5 = min{10, 5, 5}
B
10/5 (+5)
5/5
5/0 (−5)
s
t
10/10 (+5)
10/10
C
graphe modifié:
capacité / flot (modification)
()
Graphes et algorithmes
73 / 82
Sommaire
1
Introduction
2
Représentation informatique
3
Préparation aux TPs
4
Notions élémentaires
5
Exploration d’un graphe
6
Parcours et Connexité
7
Graphes particuliers
8
Algorithmes sur les graphes particuliers
9
Plus courts chemins
10
Flot maximal
11
Coloration
()
Graphes et algorithmes
74 / 82
Coloration
Soit G={X,U} un graphe non orienté, une coloration de G est une
affectation de couleurs (ou d’entiers, de manière équivalente) aux
sommets de G de telle sorte que 2 sommets adjacents n’aient pas la
même couleur (le même entier).
Une k -coloration est une coloration de G avec k couleurs: une
k -coloration est donc une partition de G en k stables distincts.
a
c
b
e
d
f
g
Figure: Exemple de 3-coloration.
()
Graphes et algorithmes
75 / 82
Coloration – Applications
Coloriage automatique d’une carte géographique, d’un diagramme.
Téléphonie mobile : chaque sommet modélise un émetteur, qui doit avoir
une fréquence (couleur) différente des émetteurs adjacents pour éviter les
interférences.
Emploi du temps : chaque sommet représente un cours, il y a une arête
entre cours
I
I
I
de même promotion
de même professeur
devant utiliser la même salle
Les couleurs sont les créneaux horaires (mieux représentés par des
entiers).
Propagation de contraintes: exemple jeu de Sudoku, chaque sommet
représente une case et est adjacent aux cases de la même ligne, même
colonne et même bloc.
()
Graphes et algorithmes
76 / 82
Coloration – Nombre et indice chromatique
Nombre chromatique
Le plus petit entier k tel qu’un graphe G soit k -colorable est appelé
nombre chromatique, noté γ(G) (c’est le nombre minimal de couleurs
pour ne pas avoir de conflits).
Soit α(G) la taille du plus grand stable de G=(X,U), appelée nombre de
stabilité de G, on a:
(X )
α(G) ∗ γ(G) ≥ Card (X ) ⇒ γ(G) ≥ Card
α(G)
Théorème de Appel et Haken (1977): Tout graphe planaire est 4-colorable
(démontré par énumération sur ordinateur).
Indice chromatique
On peut aussi colorier les arêtes d’un graphe, afin que deux arêtes
adjacentes soient de couleur différentes. Le plus petit nombre de couleurs
le permettant est appelé indice chromatique du graphe.
L’indice chromatique est bien sûr toujours supérieur ou égal au degré
maximum du graphe.
()
Graphes et algorithmes
77 / 82
Graphe bi-parti
Définition
un graphe bi-parti est un graphe G = (X , U ) dont on peut partitionner les
sommets en 2 sous-ensembles X1 et X2 avec X1 ∪ X2 = X et X1 ∩ X2 = 0/ ,
et tel que ∀(i , j ) ∈ U, i ∈ X1 ⇒ j ∈ X2 et i ∈ X2 ⇒ j ∈ X1 .
Un graphe bi-parti complet est noté Kr ,s avec r = |X1 |, s = |X2 |.
Un graphe bi-parti est 2-coloriable
un graphe bi-parti ne contient aucun cycle avec un nombre impair
d’arêtes/arcs.
l’indice chromatique d’un graphe bi-parti est égal au maximum des degrés
des sommets.
()
Graphes et algorithmes
78 / 82
Couplage
Définition
un couplage d’un graphe simple est un sous-ensemble d’arêtes sans
extrémité commune 2 à 2.
Un sommet du graphe est saturé par un couplage s’il est l’extrémité d’une
arête du couplage, sinon il est insaturé.
un couplage est parfait si tous les sommets sont saturés.
un couplage est maximal s’il n’existe pas de couplage saturant un plus
grand nombre de sommet.
un couplage parfait est toujours maximal.
un problème d’affectation est la recherche d’un couplage maximal dans
un graphe bi-parti.
()
Graphes et algorithmes
79 / 82
Recherche de couplage maximal
soit un couplage C, une chaîne est dite alternée relativement à C si elle
emprunte alternativement une arête de C et une arête de U-C (son
complémentaire). Une chaîne alternée peut être de longueur 1 (1 seule
arête).
Une chaîne alternée améliorante (CAA) relie 2 sommets non saturés par
C.
un transfert échange le rôle des arêtes d’une chaîne alternée améliorante
: celles de la CAA déjà dans C sont exclues de C, celle de la CAA pas
déjà dans C sont ajoutées à C. Le cardinal du couplage (nombre de
sommets saturés) est augmenté de 1 par un transfert.
Th: un couplage est maximal s’il n’existe pas de chaîne alternée
améliorante.
()
Graphes et algorithmes
80 / 82
Recherche de couplage maximal : algorithme
Principe d’un algo de recherche de couplage maximal :
on choisit un sommet insaturé
on construit une arborescence à partir de ce sommet:
* à un niveau N de profondeur impaire, on ajoute un sommet adjacent
au niveau N-1 par une arête hors du couplage;
* à un niveau N pair, on ajoute un sommet adjacent au niveau N-1 par
une arête dans le couplage;
on arête une branche quand on atteint un sommet insaturé à un niveau
impair.
()
Graphes et algorithmes
81 / 82
Références
Graphes et algorithmes, M.Gondran, M. Minou, Lavoisier éd.
Graphes et hypergraphes, C. Berge, Gauthiers-Villars éd.
Initiation à la théorie des graphes, C. Roux, Ellipses éd.
()
Graphes et algorithmes
82 / 82
Téléchargement