added ex3
This commit is contained in:
		
							
								
								
									
										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() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user