Applications#
Composantes connexes#
Définition
Soit \(G\) un graphe non orienté. La composante connexe d’un sommet \(s\) de \(G\) est l’ensemble des sommets atteignables depuis \(s\) en suivant un chemin dans \(G\).
Exercice (pour aller plus loin)
Décrire un algorithme pour calculer toutes les composantes connexes d’un graphe non orienté
BEGIN SOLUTION END SOLUTION
Implanter cet algorithme et visualiser son exécution
Généralisation#
Exercice
Généraliser la fonction
parcours
de la fiche 01-ParcoursDeGraphe.md pour qu’elle prenne en argument la fonction de voisinage du graphe plutôt que le graphe lui-même.
from typing import Callable, Iterable, Set
from graph import Node
def parcours_fonction(voisins: Callable[[Node], Iterable[Node]], u: Node) -> Set[Node]:
"""
INPUT:
- `voisins`: une fonction telle que `voisins(v)` renvoie les voisins sortants de `v`
- 'u' - un sommet du graphe
OUTPUT: l'ensemble des sommets `v` de `G`
tels qu'il existe un chemin de `u` à `v`
"""
### BEGIN SOLUTION
marked = {u} # L'ensemble des sommets déjà rencontrés
todo = {u} # L'ensemble des sommets déjà rencontrés, mais pas encore traités
while todo:
# Invariants:
# - Si `v` est dans `marked`, alors il y a un chemin de `u` à `v`
# - Si `v` est dans `marked` et pas dans `todo`
# alors tous les voisins de `v` sont dans dans `marked`
v = todo.pop()
for w in voisins(v):
if w not in marked:
marked.add(w)
todo.add(w)
return marked
### END SOLUTION
Exercice (suite)
Testez votre fonction sur l’exemple suivant.
Indication
Étant donné un graphe
G
tel que implanté précédément, la fonctionvoisins
requise pardistance
peut être construite comme suit:
from graph import examples
G = examples.parcours_directed()
voisins = G.neighbors
assert parcours_fonction(voisins, 'D') == {'D', 'F', 'G', 'H'}
Exercice (suite)
Reprenez de même tous les tests de la fiche 01 avec votre nouvelle fonction.
Application: ensembles définis récursivement#
De nombreux ensembles mathématiques sont définis en donnant quelques éléments initiaux, puis en applicant récursivement un processus permettant de produire de nouveaux éléments à partir d’éléments déjà présents. Par exemple, l’ensemble des entiers naturels est construit à partir de \(0\) et de la fonction successeur \(x \mapsto x+1\).
Définition
Soit \(E\) un ensemble, \(R\subset E\) un sous ensemble fini, et \(f\) une fonction associant à chaque élément de \(E\) un sous-ensemble fini de \(E\). L’ensemble \(f\) défini récursivement par \(R\) et \(f\) est le plus petit sous-ensemble de \(E\) contenant \(R\) et stable par \(f\): si \(e\in F\) alors \(f(e)\subset F\).
Exercice (pour aller plus loin)
Décrire les ensembles définis récursivement obtenus dans chacun des cas suivants:
\(E=\mathbb N\), \(R=\{1\}\), \(f(e) = \{ e + 2 \}\) BEGIN SOLUTION END SOLUTION
\(E=\mathbb N\), \(R=\{1\}\), \(f(e) = \{ 2e, e+3 \}\) BEGIN SOLUTION END SOLUTION
\(E\): listes, \(R=\{()\}\), \(f(u)\): rajouter \(0\) ou \(1\) à la fin du \(u\) BEGIN SOLUTION END SOLUTION
\(E\): listes, \(R=\{(1,2,3,2,1)\}\), \(f(u)\): supprimer la première ou dernière lettre de \(u\) BEGIN SOLUTION END SOLUTION
Exercice (pour aller plus loin)
Soit \(C_n\) l’ensemble récursivement défini par:
\(R=\{ (\underbrace{1,1,\cdots,1}_n)\}\)
\(f\) qui a une liste associe toute les listes obtenues en regroupant et sommant deux entrées consécutives
Par exemple, \(f((2,3,1,1)) = \{(5,1,1), (2,4,1), (2,3,2)\}\)Calculer à la main les quatres éléments de \(C_3\), sans oublier \((3)\)!
Calculer avec la machine tous les éléments de \(C_6\).
Combien y en a t’il?
Même chose pour \(C_1,C_2,C_3,C_4,C_5\).
Que conjecturez vous?
Pouvez vous le prouver?
BEGIN SOLUTION
END SOLUTION
Exercice (pour aller plus loin)
Une permutation est une liste d’entiers telle que, si \(n\) est sa longueur, alors tous les entiers de \(1\) à \(n\) apparaissent exactement une fois. Décrire l’ensemble des permutations comme un ensemble énuméré. Utiliser cela pour lister toutes les permutations de longueur \(n\leq 6\).
BEGIN SOLUTION
END SOLUTION