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