Graphes : introduction Graphes Graphes Graphes : G = (S, A)

Transcription

Graphes : introduction Graphes Graphes Graphes : G = (S, A)
Graphes
définitions, représentation, génération aléatoire,
Graphes : introduction
parcours en largeur, parcours en profondeur,
plus courts chemins,
Stéphane Grandcolas
arbres couvrants de poids minimal (ACM),
[email protected]
flots,
problème du voyageur de commerce.
Graphes – Stéphane Grandcolas – p. 1/40
Graphes – Stéphane Grandcolas – p. 2/40
Graphes : G = (S, A)
Graphes
Une façon de représenter une relation ou une distance entre des objets,
des éléments d’un ensemble.
Exemple : distances routières.
S : ensemble des sommets
A : ensemble des arêtes A = {{u, v}, u ∈ S, v ∈ S} (souvent notées
(u, v))
Sisteron
38
53
2
Digne
Manosque 60
6
3
8
107
1
86
67
Brignoles
Aix
7
20
Martigues
37
20
20
Marseille
4
48
5
Aubagne
48
Hyères
Toulon
20
Graphes – Stéphane Grandcolas – p. 3/40
(1,2)
(2,3)
(1,3)
(1,5)
(3,7)
(4,6)
(8,4)
(7,5)
(3,5)
(8,6)
Graphes – Stéphane Grandcolas – p. 4/40
Graphes orientés.
Graphes pondérés.
G = (S, A), avec A = {(u, v), u ∈ S, v ∈ S} un ensemble d’arcs
G = (S, A, w) : chaque arête (u, v) a pour poids w(u, v)
2
7
5
20
5
2
12
4
10
1
1
33
14
12
26
3
4
4
6
6
Exemple : container packing.
11
15
3
9
Graphes – Stéphane Grandcolas – p. 5/40
17
8
20
6
Graphes – Stéphane Grandcolas – p. 6/40
Modelisation de Fekete et Scheppers.
un ensemble d’objets rectangulaires (orientés)
un conteneur rectangulaire
Problème : peut-on placer tous les objets à l’intérieur du conteneur sans
qu’ils se recoupent ?
1. Graphes d’intervalles
2. Aucune arête n’apparait
dans les deux graphes
3. Poids maximal des stables
inférieur à la dimension
correspondante
S. P. Fekete and J. Schepers, A combinatorial characterization of higher-dimensional
orthogonal packing, 2004.
Graphes – Stéphane Grandcolas – p. 7/40
Graphes – Stéphane Grandcolas – p. 8/40
Vocabulaire (graphes non orientés).
Vocabulaire (graphes non orientés).
Sommet adjacent à un sommet u : tout sommet v tel que (u, v) ∈ A.
Graphe connexe : il existe un chemin entre tout couple de sommets.
Voisins d’un sommet u : tous les sommets qui lui sont adjacents.
Composantes connexes : classes d’équivalences pour la relation est
atteignable.
Degré d’un sommet u : nombre de sommets qui lui sont adjacents.
Chemin (u0 , u1 , . . . , uk ) : suite de sommets adjacents (∀i, (ui , ui+1 ) ∈ A).
Longueur d’un chemin : somme des poids des arêtes qui constituent le
chemin (ou nombre d’arêtes du chemin si le graphe n’est pas pondéré).
Cycle : chemin dont l’origine et la destination sont le même sommet
Graphe complet : tous les sommets sont reliés entres eux (il existe une
arête entre deux sommets quelconques) : n × (n − 1)/2 arêtes.
Densité : proportion d’arêtes présentes par rapport au graphe complet.
Arbre : graphe sans cycles.
Sommet atteignable à partir d’un sommet u : tout sommet v tel qu’il existe
un chemin entre u et v.
Graphes – Stéphane Grandcolas – p. 9/40
Vocabulaire (graphes non orientés).
voisins
sommet de degré 5
Graphes – Stéphane Grandcolas – p. 10/40
Génération aléatoire
Données : n le nombre de sommets, θ la densité désirée,
en choisissant les arêtes : pour le nombre d’arêtes voulu
(θ × n × (n − 1)/2) on tire au hasard deux sommets non déja
connectés et on les connecte,
en sélectionnant ou non chaque arête : pour chaque arête
potentielle (il y en a n × (n − 1)/2) on tire au hasard en fonction de θ
sa sélection.
chemin (6 sommets)
Avec la deuxième méthode on n’obtient pas forcément la densité θ.
Avec la première méthode si la densité est élevée (si θ vaut 1 dans le pire des cas), il vaut
mieux choisir au hasard les arêtes qui ne seront pas dans le graphe.
graphe complet
Graphes – Stéphane Grandcolas – p. 11/40
Graphes – Stéphane Grandcolas – p. 12/40
Représentation par des listes d’adjacence.
Représentation par des listes d’adjacence.
A chaque sommet est associée la liste de ses voisins.
Voisins
2
typedef struct maillon *LISTE ;
struct maillon {
int s ;
le poids de l’arete ou de l’arc si il y a besoin
int w ;
LISTE suiv ;
};
5
1
3
4
1
2
3
2
1
2
3
2
4
4
1
5
2
4
3
LISTE Voisins[MAX_SOMMETS] ;
ou
LISTE * Voisins ; /* allocation dynamique */
Graphes – Stéphane Grandcolas – p. 13/40
Représentation avec des matrices d’adjacence.
Graphes – Stéphane Grandcolas – p. 14/40
Représentation avec des matrices d’adjacence.
Pour chaque couple de sommets un booléen indique s’ils sont voisins.
1
2
3
4
5
0
1
1
0
0
2 1
0
1
1
1
3 1
1
0
1
0
4 0
1
1
0
0
5
1
0
0
0
2
1
int Mat[MAX_SOMMETS][MAX_SOMMETS] ;
5
1
Ces tables sont souvent allouées dynamiquement
3
int ** Mat ;
4
0
Graphe pondéré : une deuxième matrice pour les poids ou +∞ pour
signaler qu’il n’y a pas d’arête
Graphes – Stéphane Grandcolas – p. 15/40
Graphes – Stéphane Grandcolas – p. 16/40
Parcours en largeur.
Parcours en largeur.
Coloration des sommets pendant le parcours
parcours à partir d’un sommet origine s
: sommet non visité (état initial)
calcul des distances des sommets parcourus à s (nombre de
sommets)
BLANC
GRIS
: sommet découvert, ses voisins n’ont pas été traités
construction d’une arborescence en largeur de racine s
NOIR
: sommet visité, ses voisins ont été découverts
On découvre les sommets situés à la distance k (nombre d’arcs ou
d’arêtes) avant les sommets situés à la distance k + 1
Les sommets non atteignables à partir de l’origine ne sont jamais
découverts
d : distance des sommets au sommet origine
pred : prédécesseurs ou pères dans l’arborescence
les sommets découverts (GRIS) sont stockés dans une file d’attente
origine
Graphes – Stéphane Grandcolas – p. 17/40
Graphes – Stéphane Grandcolas – p. 18/40
Parcours en largeur.
6
5
Parcours en largeur.
7
6
5
1
7
1
3
4
3
9
4
2
1
9
2
3 4 5
Graphes – Stéphane Grandcolas – p. 19/40
Graphes – Stéphane Grandcolas – p. 19/40
Parcours en largeur.
6
5
Parcours en largeur.
7
6
5
1
7
1
3
3
9
4
9
4
2
4 5 2
2
5 2
Graphes – Stéphane Grandcolas – p. 19/40
Graphes – Stéphane Grandcolas – p. 19/40
Parcours en largeur.
6
5
Parcours en largeur.
7
6
5
7
1
1
3
4
3
9
4
2
9
2
6
2 6
Graphes – Stéphane Grandcolas – p. 19/40
Graphes – Stéphane Grandcolas – p. 19/40
Parcours en largeur.
6
5
Parcours en largeur.
7
6
5
1
7
1
3
3
9
4
9
4
2
7
2
9
Graphes – Stéphane Grandcolas – p. 19/40
Parcours en largeur.
6
5
Parcours en largeur
procédure ParcoursEnLargeur(G, s)
O(|S| + |A|)
(In : G = (S, A) un graphe, s un sommet de S)
(F est une file d’attente (FIFO))
7
1
3
4
Graphes – Stéphane Grandcolas – p. 19/40
1 pour chaque sommet u ∈ S − {s} faire
2
d[u] := ∞, pred[u] :=AUCUN, couleur[u] :=BLANC,
3 d[s] := 0, pred[s] :=AUCUN, couleur[s] :=GRIS,
4 F := ∅,
5 ENFILE(s, F ),
6 tant que F 6= ∅ faire
7
u :=DEFILE(F ),
8
pour chaque v ∈ V oisins[u] faire
9
si couleur[v] =BLANC alors
10
couleur[v] :=GRIS,
11
d[v] := d[u] + 1,
12
pred[v] := u,
13
ENFILE(v, F ),
14
couleur(u) :=NOIR,
9
2
Graphes – Stéphane Grandcolas – p. 19/40
Graphes – Stéphane Grandcolas – p. 20/40
Parcours en profondeur.
Parcours en profondeur.
produit plusieurs arborescences en profondeur
exploration récursive des voisins non déja visités du sommet courant
Coloration des sommets pendant l’exploration (permet de détecter un
sommet déja visité)
BLANC
comparable au parcours en profondeur d’un arbre
: sommet non découvert
GRIS
: sommet découvert, arborescence en cours d’exploration
NOIR
: sommet visité, arborescence sous-jacente parcourue
debut : date de découverte
f in : date de fin de parcours de l’arborescence sous-jacente (tous les
sommets voisins ont été explorés)
Pour tout sommet u
debut[u] < f in[u]
Graphes – Stéphane Grandcolas – p. 21/40
Graphes – Stéphane Grandcolas – p. 22/40
Parcours en profondeur.
6
5
Parcours en profondeur.
7
2
2
3
7
2−
3
8
1−
4
6
5
8
1−
4
1
Graphes – Stéphane Grandcolas – p. 23/40
1
Graphes – Stéphane Grandcolas – p. 23/40
Parcours en profondeur.
Parcours en profondeur.
3−
6
5
2
3−4
7
2
2−
3
8
1−
4
7
2−
8
3
6
5
1−
4
1
1
Graphes – Stéphane Grandcolas – p. 23/40
Graphes – Stéphane Grandcolas – p. 23/40
Parcours en profondeur.
Parcours en profondeur.
3−4
6
5
2
3−4
7
5
2
2−5
6−
8
3
1−
4
7
2−5
8
3
6
1−
4
1
Graphes – Stéphane Grandcolas – p. 23/40
1
Graphes – Stéphane Grandcolas – p. 23/40
Parcours en profondeur.
Parcours en profondeur.
3−4
6
5
3−4
7
2
2−5
2
6−7
3
6
5
9−
2−5
8
6−7
3
8
1−
4
7
1−8
4
1
1
Graphes – Stéphane Grandcolas – p. 23/40
Graphes – Stéphane Grandcolas – p. 23/40
Parcours en profondeur.
Parcours en profondeur.
3−4
6
5
9−
2
7
2−5
10−
4
2
8
4
1
Graphes – Stéphane Grandcolas – p. 23/40
7
2−5
10−
1−8
6
5
9−
6−7
3
3−4
11−
6−7
3
8
1−8
1
Graphes – Stéphane Grandcolas – p. 23/40
Parcours en profondeur.
9−
11−
12−
5
6
2
3−4
2
6−7
8
4
7
2−5
6−7
3
10−
1−8
8
1−8
4
1
3−4
6
5
9−
3
12−13
11−
7
2−5
10−
Parcours en profondeur.
1
Graphes – Stéphane Grandcolas – p. 23/40
Graphes – Stéphane Grandcolas – p. 23/40
Parcours en profondeur.
12−13
11−14
2
10−
4
3−4
6
5
9−
Parcours en profondeur.
12−13
11−14
7
2−5
6−7
3
8
2
10−15
1−8
4
1
Graphes – Stéphane Grandcolas – p. 23/40
6
5
9−
3−4
7
2−5
6−7
3
8
1−8
1
Graphes – Stéphane Grandcolas – p. 23/40
Parcours en profondeur : arborescence.
12−13
11−14
2
3−4
6
5
9−16
2
6−7
8
4
7
2−5
10−15
1−8
6−7
8
3
1−8
4
1
3−4
6
5
9−16
3
12−13
11−14
7
2−5
10−15
Parcours en profondeur : arcs arrières.
1
Graphes – Stéphane Grandcolas – p. 24/40
Parcours en profondeur : arcs avants.
12−13
11−14
2
10−15
4
Parcours en profondeur : arcs transverses.
3−4
6
5
9−16
Graphes – Stéphane Grandcolas – p. 25/40
12−13
11−14
7
2−5
6−7
3
8
2
10−15
1−8
4
1
Graphes – Stéphane Grandcolas – p. 26/40
6
5
9−16
3−4
7
2−5
6−7
3
8
1−8
1
Graphes – Stéphane Grandcolas – p. 27/40
Parcours en profondeur : mise en place.
procédure ParcoursEnProfondeur(G)
(In : G = (S, A) un graphe)
1
2
3
4
5
6
7
Parcours en profondeur : parcours.
procédure
VISITER(u)
1 couleur[u] =GRIS,
2 date := date + 1,
3 debut[u] := date,
4 pour chaque sommet v ∈ V oisins(u) faire
5
si couleur[v] =BLANC alors
6
pred[v] := u,
7
VISITER(v),
8 couleur[u] :=NOIR,
9 date := date + 1,
10 f in[u] := date,
u ∈ S faire
pred[u] :=AUCUN,
couleur[u] :=BLANC,
date := 0,
pour chaque sommet u ∈ S faire
si couleur[u] =BLANC alors
VISITER(u),
pour chaque sommet
Graphes – Stéphane Grandcolas – p. 28/40
Graphes – Stéphane Grandcolas – p. 29/40
Parcours en profondeur.
Parcours en profondeur : dates.
Complexité O(|S| + |A|)
Soient deux sommets u et v
soit [debut[u], f in[u]] et [debut[v], f in[v]] sont disjoints
Initialisation O(|S|)
Parcours des voisins de chaque sommet O(|A|)
(arborescences disjointes)
soit [debut[u], f in[u]] est inclus dans [debut[v], f in[v]]
(v est un ancêtre de u)
soit [debut[v], f in[v]] est inclus dans [debut[u], f in[u]]
(u est un ancêtre de v)
Donc
debut[u] < debut[v] < f in[u] ⇒ f in[v] < f in[u]
(v est un descendant de u)
Graphes – Stéphane Grandcolas – p. 30/40
Graphes – Stéphane Grandcolas – p. 31/40
Parcours en profondeur : dates.
Parcours en profondeur : théorème du chemin blanc.
Inversement si v est descendant de u dans une arborescence alors
debut(u) < debut(v) < f in(v) < f in(u)
Un sommet v est un descendant d’un sommet u si et ssi à la date debut[u]
où u est découvert il existe un chemin blanc de u à v.
v
car
6
5
9−
v est découvert après u donc debut(u) < debut(v)
2
on finit de traiter v avant u donc f in(v) < f in(u)
3−4
7
2−5
u
6−7
3
8
1−8
4
1
Graphes – Stéphane Grandcolas – p. 32/40
Graphes – Stéphane Grandcolas – p. 33/40
Parcours en profondeur : théorème du chemin blanc. Parcours en profondeur : théorème du chemin blanc.
v est descendant de u ⇒ il existe un chemin blanc de u à v
il existe un chemin blanc de u à v ⇒ v est descendant de u
supposons que v soit le premier sommet du chemin blanc qui ne soit pas un descendant de
u.
on note w son prédécesseur dans le chemin blanc
Tout sommet w situé entre u et v dans l’arborescence vérifie
debut[w] > debut[u]
donc w est BLANC quand u est découvert
v
w
u
6
5
9−
2
3−4
7
2−5
u
6−7
3
8
1−8
4
Graphes – Stéphane Grandcolas – p. 34/40
1
Graphes – Stéphane Grandcolas – p. 35/40
Parcours en profondeur : théorème du chemin blanc.
debut[u] < debut[v] puisque v est blanc quand u est découvert
debut[v] < f in[w] puisque v est un voisin de w
Plus courts chemins
G = (S, A, w) un graphe pondéré
La longueur du chemin (u1 , . . . , uk ) est
f in[w] ≤ f in[u] puisque w est un descendant de u
k−1
X
Donc
w(ui , ui+1 )
i=1
debut[u] < debut[v] < f in[u]
δ(u, v) : longueur du plus court chemin entre u et v.
et donc v est un descendant de u
Propriété. ∀s, u, v,
δ(s, v) ≤ δ(s, u) + w(u, v)
Graphes – Stéphane Grandcolas – p. 36/40
Graphes – Stéphane Grandcolas – p. 37/40
Algorithme de Dijkstra.
Algorithme de Dijkstra.
calcul des plus courts chemins à partir d’un sommet donné
notations
graphes orientés
sans arcs de poids négatifs
s est le sommet source
représentation par listes d’adjacence
d[v] représente une borne supérieure pour δ(s, v)
à tout moment d[v] vérifie
d[v] ≥ δ(s, v)
initialisation : ∀u, u 6= s, d[u] = ∞, d[s] = 0.
Graphes – Stéphane Grandcolas – p. 38/40
Graphes – Stéphane Grandcolas – p. 39/40
Algorithme de Dijkstra.
Algorithme de Dijkstra.
Relachement. Affinage de la borne d[v]
si d[v] > d[u] + w(u, v) alors on remplace d[v] par d[u] + w(u, v)
E : sommets traités (plus courts chemins connus)
F : sommets en attente
itération : extraction du sommet de F le plus proche
u
w(u,v)=2
d[u]=5
18
source
s
w
t
7
E
d[v]=9
relachement de l’arc (u,v)
12
u
v
s
F
y
x
d[v]=7
11
v
validité : puisque d[u] ≥ δ(u)
plus courts chemins
d[u] + w(u, v) ≥ δ(u) + w(u, v) ≥ δ(v)
sommets en attente
Graphes – Stéphane Grandcolas – p. 40/40
Plus courts chemins : Dijkstra.
1
inf
source
s
2
7
8
x
inf
1
w
10
4
0
2
7
Graphes – Stéphane Grandcolas – p. 42/40
inf
9
8
x
1
w
10
4
inf
inf
2
5
13
v
t
12
s
inf
u
3
inf
9
1
inf
2
5
12
Plus courts chemins : Dijkstra.
source
t
u
3
0
inf
Graphes – Stéphane Grandcolas – p. 41/40
13
v
inf
Graphes – Stéphane Grandcolas – p. 42/40
Plus courts chemins : Dijkstra.
1
inf
source
12
s
2
5
2
8
x
7
w
10
4
0
v
inf
2
5
2
inf
9
8
x
7
13
1
v
2
inf
w
10
4
13
1
t
12
s
inf
u
3
inf
9
1
12
source
t
u
3
0
inf
Plus courts chemins : Dijkstra.
inf
Graphes – Stéphane Grandcolas – p. 42/40
Plus courts chemins : Dijkstra.
1
12
source
s
2
7
8
x
2
1
w
10
4
0
2
7
Graphes – Stéphane Grandcolas – p. 42/40
inf
9
8
x
1
w
10
4
2
inf
2
5
13
v
t
12
s
inf
u
3
inf
9
1
12
2
5
12
Plus courts chemins : Dijkstra.
source
t
u
3
0
inf
Graphes – Stéphane Grandcolas – p. 42/40
13
v
inf
Graphes – Stéphane Grandcolas – p. 42/40
Plus courts chemins : Dijkstra.
1
10
source
12
s
2
5
2
8
x
7
w
10
4
0
v
2
2
5
2
8
7
w
10
4
x
3
inf
9
13
1
t
12
s
inf
u
3
inf
9
1
10
source
t
u
3
0
inf
Plus courts chemins : Dijkstra.
13
1
v
2
3
Graphes – Stéphane Grandcolas – p. 42/40
Plus courts chemins : Dijkstra.
1
10
source
s
2
7
8
x
2
1
w
10
4
0
2
7
Graphes – Stéphane Grandcolas – p. 42/40
16
9
8
x
1
w
10
4
2
3
2
5
13
v
t
12
s
13
u
3
inf
9
1
7
2
5
12
Plus courts chemins : Dijkstra.
source
t
u
3
0
inf
Graphes – Stéphane Grandcolas – p. 42/40
13
v
3
Graphes – Stéphane Grandcolas – p. 42/40
Plus courts chemins : Dijkstra.
1
7
source
12
s
2
5
2
8
x
7
w
10
4
0
v
2
2
5
2
8
7
w
10
4
x
3
16
9
13
1
t
12
s
13
u
3
16
9
1
7
source
t
u
3
0
13
Plus courts chemins : Dijkstra.
13
1
v
2
3
Graphes – Stéphane Grandcolas – p. 42/40
Plus courts chemins : Dijkstra.
1
7
source
s
2
7
8
x
2
1
w
10
4
0
2
7
3
16
9
8
x
1
w
10
4
2
Graphes – Stéphane Grandcolas – p. 42/40
2
5
13
v
t
12
s
8
u
3
16
9
1
7
2
5
12
Plus courts chemins : Dijkstra.
source
t
u
3
0
8
Graphes – Stéphane Grandcolas – p. 42/40
13
v
3
Graphes – Stéphane Grandcolas – p. 42/40
Plus courts chemins : Dijkstra.
1
7
source
12
s
2
5
2
8
x
7
w
10
4
0
v
2
2
5
2
7
3
10
9
8
x
1
2
w
10
4
13
1
t
12
s
8
u
3
10
9
1
7
source
t
u
3
0
8
Plus courts chemins : Dijkstra.
13
v
3
Graphes – Stéphane Grandcolas – p. 42/40
Plus courts chemins : Dijkstra.
1
7
source
0
s
2
7
2
5
10
9
8
x
2
1
w
10
4
pondéré, s un sommet de G
(F une file de priorité)
t
12
Algorithme de Dijkstra.
procédure DIJKSTRA(G, s)
in : G = (S, V [], w) un graphe
8
u
3
Graphes – Stéphane Grandcolas – p. 42/40
13
v
3
Graphes – Stéphane Grandcolas – p. 42/40
1 F := S,
2 pour chaque sommet u ∈ S faire
3
d[u] := ∞,
4 d[s] := 0,
5 tant que F 6= ∅ faire
6
u :=ExtraireLeMin(F ),
7
pour chaque sommet v ∈ V [u] faire
8
si d[v] > d[u] + w(u, v) alors
9
d[v] = d[u] + w(u, v),
10 renvoyer d,
Graphes – Stéphane Grandcolas – p. 43/40
Algorithme de Dijkstra.
Algorithme de Dijkstra : preuve.
En faisant une recherche linéaire dans F : O(|S|2 + |A|)
Supposition. quand u est extrait de F , d[u] > δ(s, u)
[on suppose que u est le premier dans ce cas]
En implémentant F avec un tas :
initialisations : O(|S|)
considérons un plus court chemin entre s et u,
Construction du tas : O(|S|)
soit y le premier sommet de ce chemin non dans E,
maintien du tas : O(|S| × log|S| + |A| × log|S|) = O(|A| × log|S|)
soit x le sommet précédent y.
soit O((|S| + |A|) × log|S|)
E
(O(|S| × log|S| + |A|) avec un tas de Fibonacci)
u
s
x
Graphes – Stéphane Grandcolas – p. 44/40
Algorithme de Dijkstra : preuve.
le chemin jaune est un plus court chemin
le chemin jaune et l’arête rouge est un plus court chemin
(car sous chemin d’un plus court chemin entre s et u)
δ(s, u) ≥ δ(s, y) = d[y] car (x, y) a été relaché
d[y] ≥ d[u] puisqu’on a extrait u et non pas y
donc δ(s, u) ≥ d[u] ce qui contredit l’hypothèse δ(s, u) < d[u]
E
u
s
x
y
Graphes – Stéphane Grandcolas – p. 46/40
y
Graphes – Stéphane Grandcolas – p. 45/40