diff --git a/Chapitre 4 - Graphes/C08_activite_reseau.py b/Chapitre 4 - Graphes/C08_activite_reseau.py index 609aea1..f974b3e 100644 --- a/Chapitre 4 - Graphes/C08_activite_reseau.py +++ b/Chapitre 4 - Graphes/C08_activite_reseau.py @@ -83,9 +83,61 @@ def plus_ancienne_relation(personnes): gens = (p1, p2) return gens -print(plus_ancienne_relation(exemple_reseau.values())) +# print(plus_ancienne_relation(exemple_reseau.values())) def plus_de_relations(personnes): return max(personnes, key=lambda p: len(p.relations)) -print(plus_de_relations(exemple_reseau.values())) \ No newline at end of file +# print(plus_de_relations(exemple_reseau.values())) + +def search(personnes, personne, target, depth=1): + if depth > len(personnes): + return None + if target in personne.relations: + return depth + distances = [search(personnes, personnes[relation], target, depth+1) for relation in personne.relations] + distances = [distance for distance in distances if distance is not None] + if distances: + return min(distances) + +def search(personnes, personne, target, depth=1): + # Condition d'arret + if depth > len(personnes): + return None + if target in personne.relations: + return depth, [personne, personnes[target]] + + # On appelle récursivement pour toutes les relations + distances = [] + for relation in personne.relations: + other = personnes[relation] + distance = search(personnes, other, target, depth + 1) + if distance is not None: + distances.append(distance) + + # Autre méthode + # distances = [search(personnes, personnes[relation], target, depth + 1) for relation in personne.relations] + # distances = [distance for distance in distances if distance is not None] + + # On trouve la liaison la plus courte + if distances: + distance, personnes = min(distances, key=lambda d: d[0]) + return distance, [personne] + personnes + +distance, personnes = search(exemple_reseau, exemple_reseau["Marc"], "Stéphanie") +print(f"La relation la plus courte entre Marc est Stéphanie est de {distance} relations:") +for personne in personnes: + print(f" - {personne}") + +# On vérifie si des personnes ne sont pas reliées +checked = [] +for personne in exemple_reseau.values(): + for other in exemple_reseau.values(): + if personne == other: + continue + two = sorted([personne.nom, other.nom]) + if two in checked: + continue + checked.append(two) + if search(exemple_reseau, personne, other.nom) is None: + print(f"{personne.nom} et {other.nom} n'ont pas de liaison possible") \ No newline at end of file