IFT-10541A : Hiver 2003
Semaine 7 :Les graphes (suite)
2
Tri topologique Idée :
ordonner les sommets selon la préséance indiquée par les arcs
ordre linéaire partiel sur V, appelé T
But : comparer s1 et s2 de V pour savoir si
l’un vient avant l’autre, sans trouver le chemin entre s1 et s2
3
Tri topologique Préconditions :
S est un graphe acyclique s1 vient avant s2 il y a un chemin de
s1 à s2 dans S alors : s1 < s2 dans T
Exemple : préséance de tâches en planification
4
Tri topologique : exemples
(S)A
B
C
D
E
F
G
(a)
AB CD EFG
(b)
AB CDE FG
5
Tri topologique : la mécanique Attention :
ordre partiel s1 et s2 pas toujours comparables : s1 < s2, s1 > s2, s1 = s2, ou s1 ≠ s2
Il existe toujours un tri topologique sur tout graphe acyclique (basé sur l’ordre d’entrée des nœuds). À lire : algorithme de la p. 151
6
Tri topologique : algo. p.151
(S)A
B
C
D
E
F
G
(a)
AB CD EFG
(b)
AB CDE FG
7
Tri : adressage hiérarchique
(S)A
B
C
D
E
F
G
(b)
AB CDE FG1.1
2.1 3.11
2.23.2
32
3.1.1
1.1
3.2
3
1
3.1
2
2.1
2.2
2.1.13.1.1
2.1.1
x < x.*
8
Spécifications formellesDescription en termes de types abstraits 1. initialiser un graphe à vide (création) 2. ajouter un sommet à un graphe 3. ajouter un arc à un graphe4. ôter un sommet du graphe et tous les arcs associés5. ôter un arc 6. permettre l'accès à un sommet nommé (désigné)7. indiquer si un sommet n'a pas de voisins8. parcourir les voisins d'un sommet (parcours) 9. voir si un chemin existe entre 2 sommets10. trouver le chemin le plus court (# arêtes, distance)11. trouver tous les chemins entre 2 sommets
9
Modèles d’implantation
matrice d’adjacence :
4
25
3
1
1
1 1
1 1
1
1 2 3 4 51
2
3
4
5
10
Matrice d’adjacence#define nbSommet 5sommet sommets[nbSommet];
Bool arc[nbSommet][nbSommet];
1
1 1
1 1
1
1 2 3 4 51
2
3
4
5
4
25
3
1
int no;int tag;Bool pres;char *nom;
sommet
11
1
1 1
1 1
1
1 2 3 4 51
2
3
4
5 1
1 1
1
1
1
4
25
3
1
#define nbSommet 5sommet sommets[nbSommet];
Bool arc[nbSommet][nbSommet];
int no;int tag;Bool pres;char *nom;
sommet
Matrice triangulaire
12
1
1 1
1 1
1
1 2 3 4 51
2
3
4
5 1
1 1
1
1
1
1
11
1
1
2
3
4
5 1
1
1 2 3 4 5
#define nbSommet 5sommet sommets[nbSommet];
Bool *arc[nbSommet];
int no;int tag;Bool pres;char *nom;
sommet
Matrice triangulaire
13
1
1 1
1 1
1
1 2 3 4 51
2
3
4
5 1
1 1
1
1
1
1
11
1
1
2
3
4
5 1
1
1 2 3 4 5
#define nbSommet 5sommet sommets[nbSommet];
Bool *arc[nbSommet];
int no;int tag;Bool pres;char *nom;Bool *arc;
sommet
+
Matrice triangulaire
14
1
1 1
1 1
1
1 2 3 4 51
2
3
4
5 1
1 1
1
1
1
1
21
4
1
2
3
4
5 1
3
#define nbSommet 5sommet sommets[nbSommet];
int *arc[nbSommet];
int no;int tag;Bool pres;char *nom;
sommet
Matrice triangulaire
15
1
1 1
1 1
1
1 2 3 4 51
2
3
4
5 1
1 1
1
1
1
1
21
4
1
2
3
4
5 1
3
#define nbSommet 5sommet sommets[nbSommet];
int *arc[nbSommet];
int no;int tag;Bool pres;char *nom;no *arc;
sommet
+
Matrice triangulaire
16
1
1 1
1 1
1
1 2 3 4 51
2
3
4
5 1
1 1
1
1
1
1
21
4
1
2
3
4
5 1
3
#define nbSommet 5sommet sommets[nbSommet];
int *arc[nbSommet];
int no;int tag;Bool pres;char *nom;no *arc;
sommet
Listes d’adjacence
17
Listes d’adjacenceA B
C
D
E FG
H
I
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
G
H
I
3
1
5
1
4
5
4
2
7
7
6
Numéro Nom Ptr. Listes des noeuds adjacents au ne noeud
18
Graphe non orienté 2 arcs distincts : A-B et B-A, à
relier inutile si on ordonne A et B
19
Listes croisées
1
1 1
1 1
1
1 2 3 4 51
2
3
4
5
4
25
3
1
1
2
3
4
5
1 2 3 4 5
1
1 1
1 1
1
20
Listes croisées
1
1 1
1 1
1
1 2 3 4 51
2
3
4
5
4
25
3
1
1
2
3
4
5
1 2 3 4 5
1
1 1
1 1
1
...
Le plus court chemin
22
Introduction Soient deux sommets s et t d'un graphe
G Si s et t représentent des villes, quel est
le plus court chemin entre ces deux villes sachant que : les arêtes du graphe G sont pondérées la pondération c(i,j) représente la distance
entre les deux sommets (deux villes) i et j du graphe
la pondération est positive
23
Exemple Quel est le plus court chemin reliant f à
b? p = (f, g, h, e, d, b) ||p|| = 3 + 2 + 4 + 1 + 6 ||p|| = 16
24
Cas général Comment trouver le plus court
chemin entre 2 sommets s et t d'un graphe G ?
Il existe plusieurs algorithmes : Parcours exhaustif des nœuds Algorithme de Dijkstra Algorithme de Bellman-Ford (utile
pour des pondérations négatives)
25
Parcours exhaustif des nœuds Déterminer tous les chemins possibles Choisir le plus court chemin entre s et t (2
sommets) Sur un graphe de 20 sommets avec :
une machine de 109 opérations / seconde recherche d'un chemin = 1 opération
77 ans pour avoir le résultat Un graphe de 26 sommets : avant le Big
Bang Le nombre de chemin est de l'ordre de n!
26
Algorithme de Dijkstra Se base sur le principe de la sous-
optimalité Si p est le plus court chemin entre s et t
alors: v sommet appartenant à p le sous-chemin de p (s, v) est optimal
(le plus court) le sous-chemin de p (v, t) est optimal
(le plus court)
27
Algorithme de Dijkstra Recherche du chemin le plus court avec n
sommet = un problème d'optimisation sur n variables
À chaque sommet i : une variable yi
yi = lpcc(s,i) État initial :
ys = 0 yi = + avec i s
À chaque étape : essayer de minimiser les yi
28
Algorithme de Dijkstra Soit V l’ensemble des sommets d’un graphes
Initialiser yi = + pour tous les sommets i Initialiser ys = 0.
Initialiser S à l'ensemble vide, T = V. Tant que T n'est pas vide
1.Sélectionner le sommet j de T de plus petite valeur yi
2.Faire T = T \ j et S = S j
3.Pour tous les sommets k de T adjacents à j, mettre à jour yk = min { yk, yj + c(j,k)}
Fin Tant que.
29
Algorithme de Dijkstra
a
db
f
c e
4 56
310
2
81 20
30
Algorithme de Bellman-Ford
Soit le graphe G(V,E)
Initialiser yi = + pour tous les sommets i
Initialiser ys = 0.
Répéter |V| - 1 FOIS
Pour tout arc (u,v) de E faire
yv = min { yv, yu + c(u,v)}
Pour tout arc (u,v) de E faire
Si yv > yu + c(u,v) Alors
Retourner FAUX
Retourner VRAI
Composantes connexes
32
Connexité des graphes
Connexité des graphes non
orientés
Connexité des graphes
orientés
33
Connexité des graphes non orientés
Un graphe non orienté G est connexe ssi il existe un chemin entre n’importe quelle paire de sommets distincts du graphe
34
Arbre Chemin Circuit
Graphes connexes (cas particuliers)
35
Connexité des graphes non orientés
Que se passe-t-il si le graphe G n'est pas connexe?
G apparaîtra comme un ensemble de sous-graphes connexes
On appelle chacun de ces sous-graphes une composante connexe de G
36
Composante connexe G'=(S',A') une composante connexe de
G G' est un sous-graphe connexe maximal
: S'' = S' {v} tel que G'' = (S'', A') est une composante connexe
37
Propriétés Un graphe non connexe se compose de
plusieurs composantes connexes non reliées entre elles et dont le nombre est constant.
Un graphe est connexe ssi il ne possède qu'une seule composante connexe.
Un sommet isolé (de degré 0) constitue toujours une composante connexe à lui seul.
Un graphe connexe d'ordre n (le nombre de sommets) comporte au moins n-1 arêtes.
38
Dans un graphe non orienté : un chemin est une suite d’arêtes S’il existe un chemin entre deux sommets a
et b alors celui-ci est aussi un chemin entre b et a
Dans un graphe orienté : un chemin est une suite d’arcs S’il existe un chemin entre deux sommets a
et b alors on ne peut rien conclure concernant le lien de b avec a
Connexité des graphes orientés
39
Un graphe G est fortement connexe ssi pour n’importe quelle paire de sommets distincts (a,b) de G, il existe un chemin du sommet a au sommet b et un autre chemin du sommet b au sommet a.
Connexité des graphes orientés
40
graphe G
a b
d c
e
graphe H
a b
d c
e
graphe I
a b
d c
e
Connexité des graphes orientés (exemples)
41
graphe G
a b
d c
e
graphe G’
a b
d c
e
Connexité des graphes orientés
42
Connexité des graphes orientés
Un graphe orienté G est faiblement connexe ssi son graphe non orienté sous-jacent G’ est connexe. Autrement dit, le graphe G’, qui est le graphe G dans lequel les arcs ont été remplacés par des arêtes, est connexe.
43
a b
d c
e f
a b
d c
e f
Graphes faiblement connexes (exemples)
44
Algorithme