added ex3
This commit is contained in:
parent
9c6bf54f20
commit
3c100a08fe
76
src/Ex3.py
Normal file
76
src/Ex3.py
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
|
||||||
|
"""
|
||||||
|
Nom/Prénom: Heredero/Louis
|
||||||
|
Explications:
|
||||||
|
|
||||||
|
Comme indiqué dans la donnée de l'exercice, il s'agit ici de trouvé un sous-graphe
|
||||||
|
connexe dans un graphe quelconque de consoles interconnectées
|
||||||
|
|
||||||
|
Pour ce faire nous pouvons procéder ainsi:
|
||||||
|
Étape 1 :
|
||||||
|
- Compter le nombre de voisins de chaque nœud (console)
|
||||||
|
- Éliminer ceux ayant moins de voisins que la taille de sous-graphe recherché
|
||||||
|
- Supprimer également les arêtes connectées à ces nœuds
|
||||||
|
- Recommencer jusqu'à ce que :
|
||||||
|
a) il y ait moins de nœuds que la taille du sous-graphe recherché
|
||||||
|
-> il n'est donc pas possible de trouver un sous-graphe connexe de taille n
|
||||||
|
b) aucun nœud du graphe n'ait moins de voisins que voulu (aucune suppression de nœud)
|
||||||
|
-> il peut exister un sous-graphe connexe de taille n (Cf. étape 2)
|
||||||
|
|
||||||
|
Étape 2 :
|
||||||
|
- Pour chaque nœud du graphe :
|
||||||
|
- Calculer l'ensemble des nœuds communs entre ses voisins (et lui-même),
|
||||||
|
et les voisins des ses voisins (et eux-mêmes)'
|
||||||
|
C'est-à-dire, si N1 et un nœuds et nb(N1) = {N2, N3, ...} est l'ensemble de ses voisins,
|
||||||
|
on cherche l'intersection de {N1} U nb(N1), {N2} U nb(N2), {N3} U nb(N3), etc.
|
||||||
|
- Si c'est ensemble contient au moins n éléments, il s'agit alors d'un sous-graphe connexe.
|
||||||
|
On peut ainsi en extraire les n premiers nœuds comme résultat
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def findTightlyLinkedConsoles(n: int, consoles: list[tuple[int, int]]) -> list[int]:
|
||||||
|
nodes: dict[int, set[int]] = {}
|
||||||
|
|
||||||
|
for i1, i2 in consoles:
|
||||||
|
if i1 not in nodes:
|
||||||
|
nodes[i1] = set()
|
||||||
|
if i2 not in nodes:
|
||||||
|
nodes[i2] = set()
|
||||||
|
nodes[i1].add(i2)
|
||||||
|
nodes[i2].add(i1)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
removed: set[int] = set()
|
||||||
|
for node, neighbors in nodes.items():
|
||||||
|
if len(neighbors) < n - 1:
|
||||||
|
removed.add(node)
|
||||||
|
|
||||||
|
if len(removed) == 0:
|
||||||
|
break
|
||||||
|
|
||||||
|
new_nodes = {}
|
||||||
|
for node, neighbors in nodes.items():
|
||||||
|
if node in removed:
|
||||||
|
continue
|
||||||
|
new_nodes[node] = neighbors - removed
|
||||||
|
|
||||||
|
nodes = new_nodes
|
||||||
|
|
||||||
|
if len(nodes) < n:
|
||||||
|
return []
|
||||||
|
|
||||||
|
for node, neighbors in nodes.items():
|
||||||
|
common: set[int] = neighbors | {node}
|
||||||
|
for nb in neighbors:
|
||||||
|
common = common.intersection(nodes[nb] | {nb})
|
||||||
|
|
||||||
|
if len(common) >= n:
|
||||||
|
return list(sorted(common))[:n]
|
||||||
|
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print(findTightlyLinkedConsoles(3,[(0,1),(0,4),(2,1),(3,1),(4,2),(2,3)]) == [1,2,3])
|
||||||
|
print(findTightlyLinkedConsoles(4,[(0,1),(0,4),(2,1),(3,1),(4,2),(2,3)]) == [])
|
||||||
|
print(findTightlyLinkedConsoles(4,[(0,1),(0,4),(2,1),(3,1),(4,2),(2,3),(1,4),(4,3)]) == [1,2,3,4])
|
@ -1,8 +1,27 @@
|
|||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
from Ex3 import findTightlyLinkedConsoles
|
||||||
|
|
||||||
|
|
||||||
class MyTestCase(unittest.TestCase):
|
class MyTestCase(unittest.TestCase):
|
||||||
def test_simple1(self):
|
def test_simple1(self):
|
||||||
pass
|
self.assertEqual(
|
||||||
|
findTightlyLinkedConsoles(3,[(0,1),(0,4),(2,1),(3,1),(4,2),(2,3)]),
|
||||||
|
[1,2,3]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_simple2(self):
|
||||||
|
self.assertEqual(
|
||||||
|
findTightlyLinkedConsoles(4,[(0,1),(0,4),(2,1),(3,1),(4,2),(2,3)]),
|
||||||
|
[]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_simple3(self):
|
||||||
|
self.assertEqual(
|
||||||
|
findTightlyLinkedConsoles(4,[(0,1),(0,4),(2,1),(3,1),(4,2),(2,3),(1,4),(4,3)]),
|
||||||
|
[1,2,3,4]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user