added exercise 1
This commit is contained in:
parent
6031837e82
commit
151f8492b4
40
ex1_triangles.py
Normal file
40
ex1_triangles.py
Normal 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
20
test_ex1.py
Normal 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()
|
Loading…
x
Reference in New Issue
Block a user