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
|
||||
|
||||
from Ex3 import findTightlyLinkedConsoles
|
||||
|
||||
|
||||
class MyTestCase(unittest.TestCase):
|
||||
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__':
|
||||
unittest.main()
|
||||
|
Loading…
x
Reference in New Issue
Block a user