40 lines
1.3 KiB
Python
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 |