AlgoDS-Examen2024/ex1_triangles.py
2025-01-16 10:47:32 +01:00

40 lines
1.3 KiB
Python

"""
Question 1 - De fils en tapis
But : en partant d'une liste des arêtes d'un graphe, compter le nombre
de triangles qu'il contient
Approche :
Un triangle est un ensemble de trois sommets / trois arêtes relier les uns aux autres
On peut donc ainsi parcourir l'ensemble des sommets, puis compter le nombre de voisins
qui sont également voisins d'un autre voisin.
Par exemple :
a <-> b, b <-> c, c <-> a
Parmi les voisins de a, b est aussi un voisin de c (lui-même voisin direct de a).
Si aucune attention particulière n'est portée aux redondances, il faudra diviser
par six le total obtenu, car chaque triangle aura été comptabilisé six fois,
deux fois par sommet (p. ex. abc et acb pour le sommet a).
"""
def countTriangles(edges: list[tuple[int, int]]) -> int:
neighbors: dict[int, set[int]] = {}
for node1, node2 in edges:
if node1 not in neighbors:
neighbors[node1] = set()
if node2 not in neighbors:
neighbors[node2] = set()
neighbors[node1].add(node2)
neighbors[node2].add(node1)
total: int = 0
for node1, neighbors1 in neighbors.items():
for node2 in neighbors1:
neighbors2: set[int] = neighbors[node2]
common: set[int] = neighbors1.intersection(neighbors2)
total += len(common)
return total // 6