mirror of
https://github.com/Fare-spec/cours.git
synced 2025-12-07 10:50:36 +00:00
112 lines
3.5 KiB
Python
112 lines
3.5 KiB
Python
def construire_bfs(graphe: dict, origine: str) -> dict:
|
|
"""
|
|
Construit un arbre BFS à partir de graphe et d'un sommet d'origine.
|
|
|
|
Args:
|
|
graphe (dict): Un dictionnaire représentant le graphe, où les clés sont les sommets et les valeurs sont des listes de sommets adjacents.
|
|
origine (str): Le sommet de départ pour la recherche en largeur.
|
|
|
|
Returns:
|
|
dict: Un dictionnaire représentant l'arbre BFS, où les clés sont les sommets et les valeurs sont des tuples contenant la distance depuis l'origine et le sommet precédent.
|
|
|
|
Examples:
|
|
>>> graphe = {
|
|
... '1': ['2', '3'],
|
|
... '2': ['4', '5'],
|
|
... '3': ['6'],
|
|
... '4': [],
|
|
... '5': ['6'],
|
|
... '6': []
|
|
... }
|
|
>>> construire_bfs(graphe, '1')
|
|
{'1': (0, None), '2': (1, '1'), '3': (1, '1'), '4': (2, '2'), '5': (2, '2'), '6': (2, '3')}
|
|
|
|
>>> graphe = {
|
|
... 'A': ['B', 'C'],
|
|
... 'B': ['D'],
|
|
... 'C': ['E'],
|
|
... 'D': [],
|
|
... 'E': []
|
|
... }
|
|
>>> construire_bfs(graphe, 'A')
|
|
{'A': (0, None), 'B': (1, 'A'), 'C': (1, 'A'), 'D': (2, 'B'), 'E': (2, 'C')}
|
|
"""
|
|
|
|
couleur = dict()
|
|
resultat = dict()
|
|
for som in graphe.keys():
|
|
couleur[som] = 0
|
|
frontiere = [origine]
|
|
resultat[origine] = (0, None)
|
|
couleur[origine] = 1
|
|
while len(frontiere) > 0:
|
|
courant = frontiere.pop(0)
|
|
longueur, precedent = resultat[courant]
|
|
for som in graphe[courant]:
|
|
if couleur[som] == 0:
|
|
frontiere.append(som)
|
|
resultat[som] = (longueur + 1, courant)
|
|
couleur[som] = 1
|
|
couleur[courant] = 2
|
|
return resultat
|
|
|
|
|
|
def construire_dfs(graphe: dict, origine: str) -> dict:
|
|
"""
|
|
Construit un arbre DFS à partir de graphe et d'un sommet d'origine.
|
|
|
|
Args:
|
|
graphe (dict): Un dictionnaire représentant le graphe, où les clés sont les sommets et les valeurs sont des listes de sommets adjacents.
|
|
origine (str): Le sommet de départ pour la recherche en profondeur.
|
|
|
|
Returns:
|
|
dict: Un dictionnaire représentant l'arbre DFS.
|
|
|
|
Examples:
|
|
>>> graphe = {
|
|
... '1': ['2', '3'],
|
|
... '2': ['4', '5'],
|
|
... '3': ['6'],
|
|
... '4': [],
|
|
... '5': ['6'],
|
|
... '6': []
|
|
... }
|
|
>>> construire_dfs(graphe, '1')
|
|
{'1': (0, None), '2': (1, '1'), '3': (1, '1'), '6': (2, '3'), '4': (2, '2'), '5': (2, '2')}
|
|
|
|
>>> graphe = {
|
|
... 'A': ['B', 'C'],
|
|
... 'B': ['D'],
|
|
... 'C': ['E'],
|
|
... 'D': [],
|
|
... 'E': []
|
|
... }
|
|
>>> construire_dfs(graphe, 'A')
|
|
{'A': (0, None), 'B': (1, 'A'), 'C': (1, 'A'), 'E': (2, 'C'), 'D': (2, 'B')}
|
|
"""
|
|
|
|
couleur = dict()
|
|
resultat = dict()
|
|
for som in graphe.keys():
|
|
couleur[som] = 0
|
|
frontiere = [origine]
|
|
resultat[origine] = (0, None)
|
|
couleur[origine] = 1
|
|
while len(frontiere) > 0:
|
|
courant = frontiere.pop()
|
|
longueur, precedent = resultat[courant]
|
|
for som in graphe[courant]:
|
|
if couleur[som] == 0:
|
|
frontiere.append(som)
|
|
resultat[som] = (longueur + 1, courant)
|
|
couleur[som] = 1
|
|
couleur[courant] = 2
|
|
return resultat
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import doctest
|
|
|
|
doctest.testmod(verbose=True)
|
|
print(construire_dfs(g, "1"))
|