Skip to content
Snippets Groups Projects
Commit 36821c5f authored by paul.albuquer's avatar paul.albuquer
Browse files

Corrected typos & changed BFS/DFS algo

parent 02048c54
No related branches found
No related tags found
No related merge requests found
Pipeline #40347 passed
...@@ -17,7 +17,7 @@ Les graphes ...@@ -17,7 +17,7 @@ Les graphes
* Existe-t-il une promenade sympa, passant **une seule fois** par les 7 ponts et revenant au point de départ? * Existe-t-il une promenade sympa, passant **une seule fois** par les 7 ponts et revenant au point de départ?
![Les ponts c'est beau. Source: Wikipédia, <https://bit.ly/37h0yOG>](figs/Konigsberg_bridges.png){width=40%} ![Les ponts, c'est beau. Source: Wikipédia, <https://bit.ly/37h0yOG>](figs/Konigsberg_bridges.png){width=40%}
. . . . . .
...@@ -27,7 +27,7 @@ Les graphes ...@@ -27,7 +27,7 @@ Les graphes
## Réseau social ## Réseau social
![Source, Wikipedia: <https://bit.ly/3kG6cgo>](figs/Social_Network.svg){width=40%} ![Source: Wikipedia, <https://bit.ly/3kG6cgo>](figs/Social_Network.svg){width=40%}
* Chaque sommet est un individu. * Chaque sommet est un individu.
* Chaque trait une relation d'amitié. * Chaque trait une relation d'amitié.
...@@ -37,11 +37,11 @@ Les graphes ...@@ -37,11 +37,11 @@ Les graphes
## Moteurs de recherche ## Moteurs de recherche
![Source, Wikipedia: <https://bit.ly/3kG6cgo>](figs/PageRanks-Example.svg){width=40%} ![Source: Wikipedia, <https://bit.ly/3kG6cgo>](figs/PageRanks-Example.svg){width=40%}
* Sommet est un site. * Site est un sommet.
* Liens sortants; * Liens sortants.
* Liens entrants; * Liens entrants.
* Notion d'importance d'un site: combien de liens entrants, pondérés par l'importance du site. * Notion d'importance d'un site: combien de liens entrants, pondérés par l'importance du site.
* Miam, Miam, Google (PageRank). * Miam, Miam, Google (PageRank).
...@@ -75,7 +75,8 @@ Les graphes ...@@ -75,7 +75,8 @@ Les graphes
## Notations ## Notations
* Une arête d'un graphe **non-orienté** est représentée par une paire **non-ordonnée** $(u,v)=(v,u)$, avec $u,v\in V$. * Une arête d'un graphe **non-orienté** est représentée par une paire **non-ordonnée** $(u,v)=(v,u)$, avec $u,v\in V$.
* Les arêtes ne sont pas orientées dans un graphe non-orienté (elles sont bi-directionnelles, peuvent être parcourues dans n'importe quel ordre). * Les arêtes ne sont pas orientées dans un graphe non-orienté
(elles sont bi-directionnelles, c.-à-d. peuvent être parcourues dans n'importe quel sens).
## Exemple ## Exemple
...@@ -147,7 +148,7 @@ E&=\{(1,2),(2,3),(2,4),(4,1),(4,2)\},\\ ...@@ -147,7 +148,7 @@ E&=\{(1,2),(2,3),(2,4),(4,1),(4,2)\},\\
## Définition ## Définition
* Le somme $v$ est **adjacent** au sommet $u$, si et seulement si $(u,v)\in E$; * Le somme $v$ est **adjacent** au sommet $u$, si et seulement si $(u,v)\in E$;
* Si un graphe non-orienté contient une arête $(u,v)$, $v$ est adjacent à $u$ et $u$ et adjacent à $v$. * Si un graphe non-orienté contient une arête $(u,v)$, $v$ est adjacent à $u$ et $u$ est adjacent à $v$.
## Exemple ## Exemple
...@@ -161,7 +162,7 @@ E&=\{(1,2),(2,3),(2,4),(4,1),(4,2)\},\\ ...@@ -161,7 +162,7 @@ E&=\{(1,2),(2,3),(2,4),(4,1),(4,2)\},\\
:::: column :::: column
![Sommet $a$ adjacent à $c$.](figs/ex_adj_or.svg){width=60%} ![Sommet $c$ adjacent à $a$.](figs/ex_adj_or.svg){width=60%}
:::: ::::
...@@ -191,17 +192,17 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin). ...@@ -191,17 +192,17 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin).
## Exemples ## Exemples
![Illustration d'une chaîne, ou pas chaîne dans un graphe.](figs/ex_graphe_chaine.pdf){width=80%} ![Illustration d'une chaîne dans un graphe.](figs/ex_graphe_chaine.pdf){width=80%}
# Généralités # Généralités
## Définition ## Définition
* Une **chaîne élémentaire** est une chaîne dont tous les sommets sont distincts, sauf les extrémités qui peuvent être égales * Une **chaîne élémentaire** est une chaîne dont tous les sommets sont distincts, sauf les extrémités qui peuvent être égales.
## Exemples ## Exemples
![Illustration d'une chaîne élémentaire.](figs/ex_graphe_chaine_elem.pdf){width=80%} ![Illustration d'une chaîne élémentaire dans un graphe.](figs/ex_graphe_chaine_elem.pdf){width=80%}
# Généralités # Généralités
...@@ -211,7 +212,7 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin). ...@@ -211,7 +212,7 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin).
## Exemples ## Exemples
![Illustration d'une boucle.](figs/ex_graphe_boucle.pdf){width=40%} ![Illustration d'une boucle dans un graphe.](figs/ex_graphe_boucle.pdf){width=40%}
# Généralités # Généralités
...@@ -227,12 +228,12 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin). ...@@ -227,12 +228,12 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin).
:::: column :::: column
![Graphe connexe. Source, Wikipédia: <https://bit.ly/3yiUzUv>](figs/graphe_connexe.svg){width=60%} ![Graphe connexe. Source: Wikipédia, <https://bit.ly/3yiUzUv>](figs/graphe_connexe.svg){width=60%}
:::: ::::
:::: column :::: column
![Graphe non-connexe avec composantes connexes. Source, Wikipédia: <https://bit.ly/3KJB76d>](figs/composantes_connexes.svg){width=40%} ![Graphe non-connexe avec composantes connexes. Source: Wikipédia, <https://bit.ly/3KJB76d>](figs/composantes_connexes.svg){width=40%}
:::: ::::
...@@ -269,12 +270,12 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin). ...@@ -269,12 +270,12 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin).
## Définition ## Définition
* Un **cycle** dans un graphe *non-orienté* est une chaîne de longueur $\geq 3$ telle que le 1er sommet de la chaîne est le même que le dernier, et dont les arêtes sont distinctes. * Un **cycle** dans un graphe *non-orienté* est une chaîne de longueur $\geq 3$ telle que le 1er sommet de la chaîne est le même que le dernier, et dont les arêtes sont distinctes.
* Pour un graphe *orienté* on parle de **circuit**. * Pour un graphe *orienté*, on parle de **circuit**.
* Un graphe sans cycles est dit **acyclique**. * Un graphe sans cycles est dit **acyclique**.
## Exemples ## Exemples
![Illustration de cycles, ou pas.](figs/ex_graphe_cycle.pdf){width=100%} ![Illustration de cycles.](figs/ex_graphe_cycle.pdf){width=100%}
# Question de la mort # Question de la mort
...@@ -289,7 +290,7 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin). ...@@ -289,7 +290,7 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin).
* La complexité des algorithmes sur les graphes s'expriment en fonction du nombre de sommets $V$, et du nombre d'arêtes $E$: * La complexité des algorithmes sur les graphes s'expriment en fonction du nombre de sommets $V$, et du nombre d'arêtes $E$:
* Si $|E|\sim |V|^2$, on dit que le graphe est **dense**. * Si $|E|\sim |V|^2$, on dit que le graphe est **dense**.
* Si $|E|\sim |V|$, on dit que le graphe est **peu dense**. * Si $|E|\sim |V|$, on dit que le graphe est **peu dense**.
* Selon qu'on considère des graphes denses ou peu denses, différentes structure de données peuvent être envisagées. * Selon qu'on considère des graphes denses ou peu denses, différentes structures de données peuvent être envisagées.
## Question ## Question
...@@ -461,7 +462,7 @@ $$ ...@@ -461,7 +462,7 @@ $$
. . . . . .
* $\mathcal{O}(|V|^2)$. * $\mathcal{O}(|V|^2)$
* Quel est l'espace nécessaire pour stocker une matrice d'adjacence pour un graphe non-orienté? * Quel est l'espace nécessaire pour stocker une matrice d'adjacence pour un graphe non-orienté?
. . . . . .
...@@ -488,7 +489,7 @@ $$ ...@@ -488,7 +489,7 @@ $$
# La liste d'adjacence (non-orienté) # La liste d'adjacence (non-orienté)
* Pour chaque sommet $v\in V$, stocker les sommets adjacents à $v$- * Pour chaque sommet $v\in V$, stocker les sommets adjacents à $v$.
* Quelle structure de données pour la liste d'adjacence? * Quelle structure de données pour la liste d'adjacence?
. . . . . .
...@@ -573,31 +574,31 @@ graph LR; ...@@ -573,31 +574,31 @@ graph LR;
. . . . . .
$$ $$
\mathcal{O}(|E|) \mathcal{O}(|V|+|E|)
$$ $$
* Pour les graphes *non-orientés*: $\mathcal{O}(2|E|)$. * Pour les graphes *non-orientés*: $\mathcal{O}(|V|+2|E|)$.
* Pour les graphes *orientés*: $\mathcal{O}(|E|)$. * Pour les graphes *orientés*: $\mathcal{O}(|V|+|E|)$.
## Définition ## Définition
* Le **degré** d'un sommet $v$, est le nombre d'arêtes incidentes du sommet (pour les graphes orientés on a un degré entrant ou sortant). * Le **degré** d'un sommet $v$, est le nombre d'arêtes incidentes du sommet (pour les graphes orientés on a un degré entrant ou sortant).
* Comment on retrouve le degré de chaque sommet avec la liste d'adjacence? * Comment retrouve-t-on le degré de chaque sommet avec la liste d'adjacence?
. . . . . .
* C'est la longueur de la liste chaînée. * C'est la longueur de la liste chaînée si le graphe est non-orienté.
# Parcours # Parcours
* Beaucoup d'applications nécessitent de parcourir des graphes: * Beaucoup d'applications nécessitent de parcourir des graphes:
* Trouver un chemin d'un sommet à un autre; * trouver un chemin d'un sommet à un autre;
* Trouver si le graphe est connexe; * trouver si le graphe est connexe.
* Il existe *deux* parcours principaux: * Il existe *deux* parcours principaux:
* en largeur (Breadth-First Search); * en largeur (Breadth-First Search);
* en profondeur (Depth-First Search). * en profondeur (Depth-First Search).
* Ces parcours créent *un arbre* au fil de l'exploration (si le graphe est non-connexe cela crée une *forêt*, un ensemble d'arbres). * Ces parcours créent *un arbre* au fil de l'exploration (si le graphe est non-connexe, cela crée une *forêt*, c.-à-d. un ensemble d'arbres).
# Illustration: parcours en largeur # Illustration: parcours en largeur
...@@ -621,13 +622,13 @@ $$ ...@@ -621,13 +622,13 @@ $$
## Étape par étape (vert à visiter) ## Étape par étape (vert à visiter)
![Vister `w`, `t`, `y`.](figs/parcours_larg_2.pdf){width=50%} ![Visiter `w`, `t`, `y`.](figs/parcours_larg_2.pdf){width=50%}
# Exemple # Exemple
## Étape par étape ## Étape par étape
![Vister `w`, `t`, `y`.](figs/parcours_larg_2.pdf){width=50%} ![Visiter `w`, `t`, `y`.](figs/parcours_larg_2.pdf){width=50%}
## Étape par étape ## Étape par étape
...@@ -718,7 +719,7 @@ pour sommet dans graphe et sommet non-visité ...@@ -718,7 +719,7 @@ pour sommet dans graphe et sommet non-visité
## Remarque ## Remarque
* `i` est la distance de plus cours chemin entre `v` et les sommets en cours de visite. * `i` est la distance de plus court chemin entre `v` et les sommets en cours de visite.
# Le parcours en largeur # Le parcours en largeur
...@@ -729,27 +730,28 @@ pour sommet dans graphe et sommet non-visité ...@@ -729,27 +730,28 @@ pour sommet dans graphe et sommet non-visité
. . . . . .
* Utilisation d'une **file** * Utilisation d'une **file d'attente**
. . . . . .
```C ```C
initialiser(graphe) // tous sommets sont non-visités initialiser(graphe) // tous sommets sont non-visités
file = visiter(sommet, vide) // sommet est un sommet du graphe au hasard visiter(sommet, file) // on choisit un sommet de départ
tant que !est_vide(file) tant que !est_vide(file)
v = défiler(file) défiler(file, (v,u))
file = visiter(v, file) si u != visité
ajouter (v,u) à l'arbre T
visiter(u, file)
``` ```
## Que fait visiter? ## Que fait visiter?
``` ```
file visiter(sommet, file) rien visiter(x, file)
sommet = visité marquer x comme visité
pour w = chaque arête de sommet pour chaque arête (x,w)
si w != visité si w != visité
file = enfiler(file, w) enfiler(file, (x,w))
retourne file
``` ```
# Exercice (5min) # Exercice (5min)
...@@ -765,7 +767,7 @@ file visiter(sommet, file) ...@@ -765,7 +767,7 @@ file visiter(sommet, file)
## Étape 1 ## Étape 1
* Extraire un sommet de la file; * Extraire un sommet de la file.
## Étape 2 ## Étape 2
...@@ -775,9 +777,9 @@ file visiter(sommet, file) ...@@ -775,9 +777,9 @@ file visiter(sommet, file)
. . . . . .
* Étape 1: $\mathcal{O}(|V|)$, * Étape 1: $\mathcal{O}(|V|)$
* Étape 2: $\mathcal{O}(2|E|)$, * Étape 2: $\mathcal{O}(2|E|)$
* Total: $\mathcal{O}(|V| + |2|E|)$. * Total: $\mathcal{O}(|V| + |2|E|)$
# Exercice # Exercice
...@@ -807,7 +809,7 @@ graph LR; ...@@ -807,7 +809,7 @@ graph LR;
* Initialiser les sommets comme non-lus * Initialiser les sommets comme non-lus
* Visiter un sommet * Visiter un sommet
* Pour chaque sommet visité, on visite un sommet adjacent s'il est pas encore visité récursivement. * Pour chaque sommet visité, on visite un sommet adjacent s'il est pas encore visité, récursivement.
## Remarque ## Remarque
...@@ -820,11 +822,13 @@ graph LR; ...@@ -820,11 +822,13 @@ graph LR;
. . . . . .
```C ```C
initialiser(graphe) // tous sommets sont non-visités initialiser(graphe) // tous les sommets sont non-visités
pile = visiter(sommet, vide) // sommet est un sommet du graphe au hasard visiter(sommet, pile) // on a choisit un sommet du graphe
tant que !est_vide(pile) tant que !est_vide(pile)
v = dépiler(pile) dépiler(pile, (v,u))
pile = visiter(v, pile) si u != visité
ajouter (v,u) dans l'arbre T
visiter(u, pile)
``` ```
## Que fait visiter? ## Que fait visiter?
...@@ -832,12 +836,11 @@ tant que !est_vide(pile) ...@@ -832,12 +836,11 @@ tant que !est_vide(pile)
. . . . . .
```C ```C
pile visiter(sommet, pile) rien visiter(x, pile)
sommet = visité marquer x comme visité
pour w = chaque arête de sommet pour chaque arête (x,w)
si w != visité si w != visité
pile = empiler(pile, w) empiler(pile, (x,w))
retourne pile
``` ```
...@@ -860,9 +863,9 @@ graph LR; ...@@ -860,9 +863,9 @@ graph LR;
# Interprétation des parcours # Interprétation des parcours
* Un graphe vu comme espace d'états (sommet: état, arête: action); * Un graphe vu comme espace d'états (sommet: état, arête: action)
* Labyrinthe; * Labyrinthe
* Arbre des coups d'un jeu. * Arbre des coups d'un jeu
. . . . . .
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment