Aller au contenu

Arbre couvrant⚓︎

On considère un graphe fini, connexe, non orienté, représenté par une liste d'adjacence. Cette liste d'adjacence est constituée de listes qui en Python peuvent être regroupées dans un dictionnaire ou un tableau. Chacune des listes contient les voisins d'un sommet. Dans ce exercice, on utilisera un dictionnaire.

On suppose les \(n\) sommets numérotés de \(0\) à \(n-1\).

On appelle graphe partiel d'un graphe \(G\), un graphe obtenu en supprimant certaines arêtes du graphe \(G\). Un graphe partiel contient les mêmes sommets que le graphe \(G\).

On définit ici un arbre comme un graphe fini, connexe, non orienté, sans cycle.

L'objectif est d'obtenir un arbre couvrant d'un graphe \(G\), c'est-à-dire un arbre qui est un graphe partiel de \(G\). Il y a plusieurs possibilités.

Exemple

graphe

De gauche à droite:

  • un graphe représenté par le dictionnaire g = {0: [1, 2, 3], 1: [0, 4, 5], 2: [0, 3, 4], 3: [0, 2, 4], 4: [1, 2, 3, 5], 5: [1, 4, 6], 6: [5]}.

  • le même graphe avec en rouge les arêtes qui sont conservées.

  • l'arbre obtenu représenté par le dictionnaire {0: [1, 2, 3], 1: [0, 4, 5], 2: [0], 3: [0], 4: [1], 5: [1, 6], 6: [5]}.

Il s'agit d'un arbre parmi plusieurs possibles. Par exemple, on aurait pu supprimer l'arête entre les sommets 0 et 3 et garder à la place l'arête entre les sommets 2 et 3.

Question

Compléter le code de la fonction arbre_couvrant qui prend en paramètre un dictionnaire représentant un graphe (supposé fini, connexe, non orienté) et renvoie un dictionnaire représentant un arbre couvrant.

Pour chaque dictionnaire, les clés sont les sommets, (chaque sommet est représenté par son numéro), et chaque valeur associée à une clé est la liste des voisins du sommet.

On utilisera un parcours en largeur.

On pourra utiliser une file

Pour représenter une file, on peut se servir de la fonction deque qui est déjà importée depuis le module collections.

On crée une file vide avec l'instruction file = deque().

Pour insérer un élément elt dans une file, on écrit file.append(elt). Pour défiler un élément d'une file non vide et l'affecter, on écrit elt = file.popleft().

On obtient la longueur d'une file avec la fonction len.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013beqn,49vi[à3mo5_tR;Ph}kMlpwf(: cg.a=ry0S6]Iu/72){s18d050#0c0r0J0j0z0Y0F0G0z0J0Y0Y0K010r0j0A010406050Y0S0n0n0J0L0M040O0o0z0S0_0o0e0F020J0n0A0t0F0s0c130L0d0S0c0Y050T101214160~0A04051B1u1E0T1B0~0#0j0i0.0:0=0@0v0j0H0v0z1S0v0r0|050)0b0z0c1N0;0?011R1T1V1T0r1#1%1Z0r0L1C0r0v0.190Y0A0J0e0@0V011)1P010C0+0c0e1h0c1Z1 21261+291%2c0n2e040a0F0u0L0o0A0o0Y0j1c1e0%1}0L0L0c0G2z1u2g0e1C0T1{2L1^1`1_1!0#2i0@1V0e2b2w1Z1K1M0/1*2V0j2X0e0o2#1Z0A2E1C2J2L2?0 201e2%272,0L130z0|0F0Z2I2`0}2_2h2|1+2~30320V3521372J2U013c0J31040F0m3g2K0~3j3a0@3m3o0F0g3s3i2`3k3y320p3C3u3E3w3l0o2 3n320P3J382{1O3b3O3d3p0U3T3v3W3x3Y3Q3p0!3$3L3(3N3P3z0h3.393:3G040Z0N3^3V2(3;3Z0Z341v363K3_413{0Z3f463h1F2;1u2#2O0#1`2T3M0G2-2o0$1L1C2:0c2=363C054p0%4x49270x0|0%0C4z3%410B324K3/4a0C0|140b2E0q4p0S0i0L210r4P4E1+0{040D4(402}0|0H4#0A0v0c4.3k4+0W0E3J0F500F3U3F4T0L4V4_4e2K524L270o0|0K3C5b4Q274+0X4`3M0n0j0|3~594D4/4*0|4~5t5i4)0@4+0k0Q0w5h5A5v0@0G0Z0|030F1d0.0v0o0j2x0r0F1%0F0Y0o120(0F0N1}5$0F4#0G2*582?06515I54042k5:365@3M5e045g5z533M0e4H0c1q5{4f5c5w4,0W4 51633`0|5`5n3:5 0I6l4a4T0A0A2b0#6p5k0|4-5t6h415p5r6w6c6e5t5=6g6b0@4G040B1R1%5h6B2}0b0|2l6F5C6y6Y3l6j2a6#4|6S6L015 020H0r0t6+5j1+6D045s2^6,4+5y5;5?5?6T3b0|5!5$4%626,5 612?5}6i5_6(6A7a0|6o7i6@3x0|2v0A1%0C786|7n014+0D6H707150736M6j3O6?5B6$040i5T2x0e7I5J6-4N042*7Q5^4=0J4@692K7E7x0|0k6#6504762n7u4y6}0|0Q6 477C7C7%6N0j4J797w7,7M5U7V807J0o7T2,7:3h7e41880|857d7%7,4U2E6)5x6f7`7`8j6%6R7m877k7+6r6t0e6v8v7R7y8y7L7N8h7;7w6*6I8q8q8s048l7#5u4{7)8G7.0(8n040Q6#6n8G7Z8A8C7v7J8F8D5^837O8!7A7_8O7{6,8k568m8:3M5D8G8=8J6a8L7?7W5~5f993:92907f8Y8b7$7=8#8p8d4F0|2E0r0S0L7P867R8}573T0T4B4w4g9C0T4j1u0r4l9H2R2M0J1$9E4j1A8U3M2E0n0q0C0J0x0c0q0v0m0|1m1o680-7^4f1H371B0R0z0F1s5W0J0S0=0j0F2v9|9O0F0#001b0+5U0c0L0F0S1e200L4Y0L0-2b9~2t0C1d0%9s0fa21d0G0F0l5X000*2Ba3ab1(0A2a7l1I1D040y0*0-0zaw0i4$0J0H1(0J0i2Faaac14afah1e0:0LaQ9s9@0Y5W1q005Q0o0b0_2b5Wab0F8Sa21(0v9`0r0ca(5p0e0j301(5%0#ar5X1s9~1a0-af5W0G4^b1aZ1^1(5Y9h5R8I5*2n5,0J5.2X9@bfa|0Ga@0%0-a}2E0-9h0-0#0S0F7Y7!aE379F0(0*0,04.