Title: Les Graphes
1Les Graphes
2Graphes
- Un graphe G (V, E) consiste en un ensemble V de
noeud, et un ensemble E darêtes, tels que chaque
arête dans E relie une paire de nœuds dans V. - Le nombre de nœuds est dénoté V, et le nombre
darêtes est dénoté E.
3Graphes (2)
Un graphe peut être dirigé ou non dirigé.
4Chemins et cycles
- Chemin (de longueur n) Une séquence de noeuds
v0, v1, , vn avec une arête de vi à vi1 pour
chaque 0 lt i lt n. - Un chemin est simple si tous les nœuds dans le
chemin sont distincts. - Un cycle est un chemin de longueur 3 ou plus
reliant un nœud vi à lui même. - Un cycle est simple si le chemin est simple, sauf
que les premiers et derniers nœuds sont les même.
5Composantes connexes
- Un graphe non dirigé est connexe sil existe un
chemin entre toutes les paires de nœuds. - Les sous-graphes connexes maximaux sont appelés
composantes connexes
6Représentation (dirigé)
7Représentation (non dirigé)
8Coût de la représentation
- Matrice dadjacence
- Listes dadjacence
9Graphe Type de donnée abstrait
- class Graph // Classe abstraite
- public
- virtual int n() 0 // de noeuds
- virtual int e() 0 // darêtes
- // Retourne lindice du premier voisin
- virtual int first(int) 0
- // Retourne lindice de prochain voisin
- virtual int next(int, int) 0
- // Insère une nouvelle arête
- virtual void setEdge(int, int, int) 0
- // Enlève une arête
- virtual void delEdge(int, int) 0
- // Retourne la longueur de larête
- virtual int weight(int, int) 0
- // Retourne la valeur dun noeud
- virtual int getMark(int) 0
- // Assigne une valeur à un noeud
- virtual void setMark(int, int) 0
10Implémentation(matrice dadjacence)
define UNVISITED 0 define VISITED
1 class Graphm public Graph private int
numVertex, numEdge int matrix
int mark public
11Graphm(int numVert) int i, j
numVertex numVert numEdge 0 mark
new intnumVert for (i0 iltnumVertex
i) marki UNVISITED matrix
(int) new intnumVertex for (i0
iltnumVertex i) matrixi new
intnumVertex for (i0 ilt numVertex i)
for (int j0 jltnumVertex j)
matrixij 0
12Graphm() delete mark for
(int i0 iltnumVertex i) delete
matrixi delete matrix int n()
return numVertex int e() return numEdge
13int first(int v) int i for (i0
iltnumVertex i) if (matrixvi ! 0)
return i return i // Donne le
voisin de v1 après v2 int next(int v1, int v2)
int i for(iv21 iltnumVertex
i) if (matrixv1i ! 0) return i
return i
14 void setEdge(int v1, int v2, int wgt) if
(matrixv1v2 0) numEdge
matrixv1v2 wgt void delEdge(int v1,
int v2) if (matrixv1v2 ! 0)
numEdge-- matrixv1v2 0 int
weight(int v1, int v2) return matrixv1v2
int getMark(int v) return markv
void setMark(int v, int val) markv val
15Implémentation(liste dadjacence)
class Edge public int vertex, weight
Edge() vertex -1 weight -1 Edge(int
v, int w) vertex v weight w
16class Graphl public Graph private int
numVertex, numEdge ListltEdgegt vertex
int mark public
Graphl(int numVert) int i, j
numVertex numVert numEdge 0 mark
new intnumVert for (i0 iltnumVertex
i) marki UNVISITED // Crée et
initialise la liste dadjacence vertex
(ListltEdgegt) new ListltEdgegtnumVertex
for (i0 iltnumVertex i) vertexi
new LListltEdgegt()
17 Graphl() delete mark for
(int i0 iltnumVertex i) delete vertexi
delete vertex int n() return
numVertex int e() return numEdge int
first(int v) Edge it
vertexv-gtsetStart() if (vertexv-gtgetValue
(it)) return it.vertex else return
numVertex
18 int next(int v1, int v2) Edge it
vertexv1-gtgetValue(it) if (it.vertex
v2) vertexv1-gtnext() else
vertexv1-gtsetStart() while
(vertexv1-gtgetValue(it) (it.vertex lt v2))
vertexv1-gtnext() if
(vertexv1-gtgetValue(it)) return it.vertex
else return numVertex
19 void setEdge(int v1, int v2, int wgt) Edge
it(v2, wgt) Edge curr
vertexv1-gtgetValue(curr) if (curr.vertex
! v2) for (vertexv1-gtsetStart()
vertexv1-gtgetValue(curr)
vertexv1-gtnext()) if (curr.vertex gt
v2) break if (curr.vertex v2)
vertexv1-gtremove(curr) else numEdge
vertexv1-gtinsert(it)
20void delEdge(int v1, int v2) Edge curr
vertexv1-gtgetValue(curr) if (curr.vertex
! v2) for (vertexv1-gtsetStart()
vertexv1-gtgetValue(curr)
vertexv1-gtnext()) if (curr.vertex gt
v2) break if (curr.vertex v2)
vertexv1-gtremove(curr) numEdge--
21 int weight(int v1, int v2) Edge curr
vertexv1-gtgetValue(curr) if (curr.vertex
! v2) for (vertexv1-gtsetStart()
vertexv1-gtgetValue(curr)
vertexv1-gtnext()) if (curr.vertex gt
v2) break if (curr.vertex v2)
return curr.weight else return 0
int getMark(int v) return markv
void setMark(int v, int val) markv val
22Parcours dun graphe
- Certaines applications nécessitent de visiter
chaque nœuds exactement une fois. - Une application peut demander de visiter les
nœuds dans un ordre particulier en accord avec la
topologie du graphe. - Exemples
- Jeu déchec
- Chemin le plus court
23Parcours dun graphe(2)
- Pour sassurer de visiter tous les noeuds
- void graphTraverse(const Graph G)
- for (v0 vltG-gtn() v)
- G-gtsetMark(v, UNVISITED) //Initialisation
- for (v0 vltG-gtn() v)
- if (G-gtgetMark(v) UNVISITED)
- doTraverse(G, v)
24Parcours en profondeur (1)
- void DFS(Graph G, int v)
- PreVisit(G, v)
- G-gtsetMark(v, VISITED)
- for (int wG-gtfirst(v) wltG-gtn()
- w G-gtnext(v,w))
- if (G-gtgetMark(w) UNVISITED)
- DFS(G, w)
- PostVisit(G, v)
25Fouille en profondeur(2)
26Parcours en largeur (1)
- Comme la fouille en profondeur, sauf quon
remplace la pile par une file dattente - On visite les voisins dun nœuds avant daller
plus en profondeur dans le graphe.
27Parcours en largeur (2)
- void BFS(Graph G, int start,QueueltintgtQ)
- int v, w
- Q-gtenqueue(start)
- G-gtsetMark(start, VISITED)
- while (Q-gtlength() ! 0)
- Q-gtdequeue(v)
- PreVisit(G, v)
- for(wG-gtfirst(v)wltG-gtn()wG-gtnext(v,w))
- if (G-gtgetMark(w) UNVISITED)
- G-gtsetMark(w, VISITED)
- Q-gtenqueue(w)
-
- PostVisit(G, v)
-
28Parcours en largeur (3)
29Tri topologique(1)
- Problème Étant donné un ensemble de tâches à
accomplir (certaines tâches devant être
effectuées avant dautres), afficher les tâches
dans un ordre qui respecte leur ordonnancement.
30Tri topologique(2)
- void topsort(Graph G) // Tri topologique
- int i
- for (i0 iltG-gtn() i) // Initialisation
- G-gtsetMark(i, UNVISITED)
- for (i0 iltG-gtn() i) // traiter chaque
- // composante connexe
- if (G-gtgetMark(i) UNVISITED)
- tophelp(G, i)
-
- void tophelp(Graph G, int v)
- G-gtsetMark(v, VISITED)
- for (int wG-gtfirst(v) wltG-gtn()
- w G-gtnext(v,w))
- if (G-gtgetMark(w) UNVISITED)
- tophelp(G, w)
- printout(v) // PostVisite
31Tri topologique (3)
32Utiliser une file
- void topsort(Graph G, Queueltintgt Q)
- int CountG-gtn()
- int v, w
- for (v0 vltG-gtn() v) Countv 0
- for (v0 vltG-gtn() v)
- for (wG-gtfirst(v) wltG-gtn()
- w G-gtnext(v,w))
- Countw // Add to v2's count
- for (v0 vltG-gtn() v) // Initialise Q
- if (Countv 0)
- Q-gtenqueue(v)
- while (Q-gtlength() ! 0)
- Q-gtdequeue(v)
- printout(v) // PréVisite de V
- for (wG-gtfirst(v) wltG-gtn()
- w G-gtnext(v,w))
- Countw--
- if (Countw 0)
- Q-gtenqueue(w)