Telechargé par blackolive972

coursGraphes

Algorithmique avancée
Théorie des graphes
Mme Henry Gros-Désormeaux
Professeur agrégé de Mathématiques, docteur en informatique
Université des Antilles
Février 2020
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
1 / 33
1. Introduction
2. Généralités sur les graphes
2.1 Vocabulaire
2.2 Représentation d'un graphe
2.3 Algorithmes de parcours de graphes
3. Arbres
3.1 Vocabulaire
3.2 Arbre binaire
Pré requis : liste, tableau
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
2 / 33
Problème des 7 ponts de Könisgberg, Euler, 1736
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
3 / 33
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
4 / 33
Problème du voyageur de commerce, Hamilton
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
5 / 33
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
6 / 33
Dénition 2.1
Graphe non orienté G = (V , E ), n sommets, m arêtes
V : ensemble non vide et ni de sommets
E : ensemble d'arêtes (paire d'éléments de V , éventuellement valuée)
Si e = (x, y ), x et y sont les extrémité de e et x , y sont dits adjacents
ou voisins
e est incidente à x et y
ordre d'un graphe : nombre de sommets, degré d'un sommet : nombre
de voisins, notion de sommet isolé
Propriétés 1
P
x∈V
d(x) = 2|E |
Cadre : Graphe simple
Graphe orienté : arcs, degré intérieur, degré extérieur
Graphe pondéré : arêtes valuées
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
7 / 33
Exemple 2.1
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
8 / 33
Chaîne, cycle, chemin, circuit
Graphe non orienté
chaîne [x, y ] : suite nie consécutives d'arêtes reliant les sommets x et
y
chaîne élémentaire : sommets distincts, chaîne simple : arêtes
distinctes
cycle : chaîne simple dont les 2 extrémités sont identiques
Graphe orienté
chemin [x, y ] : suite nie d'arcs consécutifs reliant x à y
chemin élémentaire, chaîne élémentaire
circuit
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
9 / 33
chemin, chaîne eulérien : toutes les arêtes sont présentes une seule fois
cycle, circuit hamiltonien: tous les sommets sont présents une seule fois
longueur : nombre d'arêtes
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
10 / 33
Matrice d'adjacence
Tableau à double entrée M[i][j], de dimension N(nombre de sommets)
M[i, j] = 1 ou 0
0
1

1

0
0

1
0
1
1
1
1
1
0
0
1
0
1
1
0
0
0
1

1

0
0

import numpy as np
G=np.array(
[[0,1,1,0,0],[1,0,1,1,1],[1,1,0,1,1],[0,1,0,0,0],[0,1,1,0,0]])
Occupation mémoire O(n2 )
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
11 / 33
Matrice d'incidence
Pour un graphe orienté Tableau à double entrée M[i][j], de dimension
N(nombre de sommets)
M[i, j] = 1 si i est l'origine de l'arc, -1 si i est l'extrémité , 0 sinon
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
12 / 33
Liste d'adjacence
0 → 1, 2, 1 → 0, 2, 3, 4, 2 → 0, 1, 3, 4, 3 → 1, 4 → 1, 2
S=[0,1,2,3,4]
G=[[1,2],[0,2,3,4],[0,1,3,4],[1],[1,2]]
Graphe orienté : liste de successeurs ou liste de prédecesseurs
Occupation mémoire O(n + m)
Autre représentation possible : liste des sommets et liste des arêtes ou liste
des arcs
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
13 / 33
Représentation par classe en Python
class Graph:
def __init__(self,nbsommets,listeAdj):
self.n=nbsommets
self.adjacence=listeAdj
def nbsommets(self):
return self.n
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
14 / 33
Introduction
Exploration globale du graphe
Dénition 2.2
Un graphe non orienté est connexe si deux sommets quelconques peuvent
être reliés par une chaîne.
Un graphe orienté est fortement connexe, s'il existe un chemin entre tous
sommets x et y .
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
15 / 33
Exploration en largeur
Sommet initial r : racine de l'exploration
Un sommet marqué est exploré quand on a marqué tous ses voisins
FIFO : premier marqué, premier traité
exemple : r : sommet a
[[b, c][a, c, d, e], [a, b, e], [b], [b, c]] Ordre d'exploration :a b c d e
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
16 / 33
Entrée : G: graphe, s: racine
début
file : liste vide
marque : liste de n booléens initialisés à Faux
marque[s]=vrai
enfiler(s,file)
Tant que file non vide:
u=défiler(file)
pour chaque sommet v adjacent au sommet u:
si marque[v] est faux alors
marque[v]=vrai
enfiler(v)
fin si
fin pour
Fin tant que
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
17 / 33
Exploration en profondeur
Sommet initial s : racine de l'exploration
Un sommet marqué est exploré quand on a marqué tous ses voisins
LIFO : dernier marqué, premier traité
exemple : s : sommet A
Ordre d'exploration :
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
18 / 33
Parcours en profondeur récursif
Entrée : G: graphe, s: racine\\
marque : liste initialisée avec n booléens à False
Début
parcours_profondeur(G,s,marque)
marque[s]=True
pour chaque sommet v adjacent au sommet s:
si v.marque est faux alors
parcours_profondeur(G,v,marque)
fin si
fin pour
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
19 / 33
Recherche de cycles dans un graphe
Théorème 2.1
Soit G un graphe non-orienté de matrice d'adjacence A. Le nombre de
chaines de longueur n joignant le sommet i au sommet j est donné par le
terme d'indice i,j de la matrice An
Conséquences : Méthode pour déterminer l'existence de cycles
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
20 / 33
Algorithme de Dijkstra, 1959
Généralisation de BFS
Graphe Valué avec des coûts positifs
Principe du marquage
sommet non marqué, en cours de traitement, marqué
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
21 / 33
Dénition 3.1
Un arbre est un graphe simple non orienté connexe sans cycles
Applications : arbres généalogiques, arbres de décision (météorologie,
domaine médical...)
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
22 / 33
Vocabulaire
racine (→orientation implicite), feuille (degré 1)
Propriétés 2
Pour tout sommet u, il existe un unique chemin de la racine vers u.
Nombre d'arêtes=nombre de sommets −1
Tout sommet a sur ce chemin est un ancêtre de u et u est dit descendant
de a.
père, ls, arité d'un sommet : nombre de ls, feuille
profondeur d'un sommet : distance à la racine (3 est à la hauteur 0)
Hauteur d'un arbre : distance maximale d'une feuille à la racine
Le sous-arbre de racine 6 est de hauteur 1
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
23 / 33
Structure d'arbres
class Arbre:
def __init__(self,racine,listeFils):
self.n=racine
self.fils=listeFils
def ajoutfils(self,arbre1):
self.fils=arbre1
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
24 / 33
Les arbres binaires sont dénis récursivement.
Un arbre binaire T est une structure :
qui ne contient aucun noeud (arbre vide) ou
qui est formé de 3 ensembles disjoints de noeuds : un noeud racine, un
arbre binaire (sous-arbre gauche) et un arbre binaire (sous-arbre droit)
Vocabulaire : enfant gauche, enfant droit, enfant manquant
Arbre binaire complet : chaque noeud est soit une feuille, soit un noeud
qui a 2 enfants.
A la profondeur p, 2p noeuds.
Si h est la hauteur de l'arbre binaire, le nombre de feuilles est majoré par 2h
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
25 / 33
Implémentation
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
26 / 33
Arbres binaires de recherche
Chaque noeud contient une clé et éventuellement des données satellites.
Les clés sont stockées de manière à satisfaire la propriété suivante :
Propriétés 3
Soit x un noeud d'un arbre binaire.
Si y est un noeud du sous-arbre gauche de x, alors y.clé≤ x.clé
Si y est un noeud du sous-arbre de droite de x, alors x.clé≤y.clé
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
27 / 33
Parcours en largeur
Achage des noeuds niveau par niveau
Entrée : A: arbre
début
file:liste vide
Si A non nul,
enfiler(A,file)
Tant que file non vide:
u=défiler(f)
Si u.filsG non nul
enfiler(u.filsG)
Fin Si
Si u.filsD non nul
enfiler(u.filsD)
Fin Si
Fin tant que
Fin Si
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
28 / 33
Parcours en profondeur
3 types de parcours :
parcours préxe : ache la racine avant les valeurs de chacun de ses
sous-arbes
parcours suxe : ache la racine après la valeur de ses sous-arbres
parcours inxe : ache les valeurs du sous-arbre gauche, puis la
racine, puis les valeurs du sous-arbre droit (ordre trié)
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
29 / 33
préxe : r,a,c,h,d,i,j,l,b,e,k,f
suxe: h,c,i,l,j,d,a,k,e,f,b,r
inxe: c,h,a,i,d,l,j,r,k,e,b,f
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
30 / 33
Pseudo-code
ParcoursInfixe(x)
Si x non nul
ParcoursInfixe(x.gauche)
Afficher x.clé
ParcoursInfixe(x.droite)
Fin Si
ParcoursPrefixe(x)
Si x non nul
Afficher x.clé
ParcoursPrefixe(x.gauche)
ParcoursPrefixe(x.droite)
Fin Si
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
31 / 33
Recherche d'une clé
Pseudo-code
Version récursive
Rechercher(x,k)
Si x est nul ou k=x.cle
renvoie x
Si k<x.cle
renvoie Rechercher(x.gauche,k)
sinon renvoie Rechercher(x.droite,k)
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
32 / 33
Insertion d'un élément
Arbre_Inserer(T,z)
y=None
x=T.racine
Tant que x non vide
y=x
si z.cle < x.cle
x=x.gauche
sinon x=x.droite
z.p=y
si y==nul
T.racine=z
sinon si
z.cle<y.cle
y.gauche=z
sinon
y.droite=z
Mme Henry Gros-Désormeaux (UA)
Algorithmique avancée
Février 2020
33 / 33