Les Graphes - PowerPoint PPT Presentation

About This Presentation
Title:

Les Graphes

Description:

Les Graphes Graphes Un graphe G = (V, E) consiste en un ensemble V de noeud, et un ensemble E d ar tes, tels que chaque ar te dans E relie une paire de n uds ... – PowerPoint PPT presentation

Number of Views:165
Avg rating:3.0/5.0
Slides: 33
Provided by: Frano87
Category:

less

Transcript and Presenter's Notes

Title: Les Graphes


1
Les Graphes
2
Graphes
  • 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.

3
Graphes (2)
Un graphe peut être dirigé ou non dirigé.
4
Chemins 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.

5
Composantes 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

6
Représentation (dirigé)
7
Représentation (non dirigé)
8
Coût de la représentation
  • Matrice dadjacence
  • Listes dadjacence

9
Graphe 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

10
Implémentation(matrice dadjacence)
define UNVISITED 0 define VISITED
1 class Graphm public Graph private int
numVertex, numEdge int matrix
int mark public
11
Graphm(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
12
Graphm() delete mark for
(int i0 iltnumVertex i) delete
matrixi delete matrix int n()
return numVertex int e() return numEdge

13
int 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
15
Implémentation(liste dadjacence)
class Edge public int vertex, weight
Edge() vertex -1 weight -1 Edge(int
v, int w) vertex v weight w
16
class 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)
20
void 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
22
Parcours 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

23
Parcours 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)

24
Parcours 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)

25
Fouille en profondeur(2)
  • Coût ?(V E).

26
Parcours 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.

27
Parcours 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)

28
Parcours en largeur (3)
29
Tri 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.

30
Tri 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

31
Tri topologique (3)
32
Utiliser 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)
Write a Comment
User Comments (0)
About PowerShow.com