added exercise 1

This commit is contained in:
Louis Heredero 2025-01-16 10:47:32 +01:00
parent 6031837e82
commit 151f8492b4
Signed by: HEL
GPG Key ID: 8D83DE470F8544E7
2 changed files with 60 additions and 0 deletions

40
ex1_triangles.py Normal file
View File

@ -0,0 +1,40 @@
"""
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

20
test_ex1.py Normal file
View File

@ -0,0 +1,20 @@
import unittest
from ex1_triangles import countTriangles
class MyTestCase(unittest.TestCase):
def test_simple1(self):
self.assertEqual(
countTriangles([(0, 1), (1, 2), (0, 2)]),
1
)
def test_simple2(self):
self.assertEqual(
countTriangles([(2, 1), (1, 2), (2, 3)]),
0
)
if __name__ == '__main__':
unittest.main()