Graphe biparti

Un graphe est dit biparti si on peut colorer ses sommets avec uniquement deux couleurs de telle manière que deux sommets voisins quelconques n'ont pas la même couleur.

Le graphe ci-dessous est biparti.

graphe biparti

Coloration

Les sommets sont colorés avec uniquement deux couleurs. Aucun sommet n'a un voisin de la même couleur.

coloration

Séparation

Le même graphe dessiné avec les sommets regroupés par couleur.

separation

Cette observation illustre une autre définition des graphes bipartis :

« On considère un graphe connexe non orienté \(G(S, A)\). \(S\) est l'ensemble des sommets, \(A\) l'ensemble des arêtes. Ce graphe est dit biparti si l'ensemble \(S\) peut être divisé en deux sous-ensembles disjoints \(S_1\) et \(S_2\) tels que chaque arête de \(A\) a une extrémité dans \(S_1\) et l'autre extrémité dans \(S_2\). »

Un graphe est implémenté à l'aide d'un dictionnaire. Un sommet est représenté par son numéro. Les clés du dictionnaire sont les sommets. La valeur associée à une clé s est la liste des voisins du sommet s. Par exemple, le graphe plus haut est représenté par: {0: [1, 2, 3], 1: [0, 4, 6, 7], 2: [0, 4], ...}.

Compléter la fonction est_biparti qui prend en paramètres un graphe graphe supposé connexe et un sommet sommet_initial à partir duquel le parcours est effectué et renvoie True si le graphe est biparti et False sinon. Un tableau couleurs servira à stocker à chaque indice i la couleur du sommet numéro i (voir plus bas).

Algorithme

On utilise une file et un parcours en largeur.

On affecte au premier sommet la couleur \(1\), puis à ses voisins la couleur \(-1\). On parcourt ensuite les voisins des voisins qui n'ont pas déjà été colorés en leur affectant la couleur \(1\), et ainsi de suite.

Si, lorsqu'on explore les voisins d'un sommet s, on en rencontre un qui est déjà coloré, soit sa couleur est différente de celle de s et on ne fait rien, soit sa couleur est identique à celle de s et alors le graphe n'est pas biparti.

Les sommets sont visités dans un parcours en largeur implémenté à l'aide d'une file.

Colorer le sommet initial et le placer dans la file

Tant que le file n'est pas vide :

Défiler un sommet Visiter chacun de ses voisins :

Si un voisin n'est pas coloré, lui donner une couleur et le placer dans la file Sinon, contrôler sa couleur et renvoyer éventuellement False

Renvoyer True si le parcours est terminé

Aide: utilisation de deque pour implémenter une file

On crée une file vide avec l'instruction file = deque(). Pour insérer un élément elt dans la file, on écrit file.append(elt). Pour défiler un élément et l'affecter, on écrit elt = file.popleft(). La fonction len renvoie la longueur de la file.

Exemples
>>> g = {0: [1, 2], 1: [0, 2], 2: [0, 1]}
>>> est_biparti(g, 0)
False
>>> g = {0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2]}
>>> est_biparti(g, 0)
True

###(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

.128013s3_8èufvIy n7aêS1me(P24:twi]D[h)6Oo;bcdg/T0lqp.rF-,=k95Rxé050N0t0z0o0B0S0b0l0M0S0o0b0b0!010z0B0U010406050b0g0s0s0o0W0k040q0J0S0g0~0J0m0l020o0s0U0K0l0(0t180W0T0g0t0b050P1517191b130U041z1G051J0P1J1L1G130N0B0i0?0^0`0|0F0B0O0F0S1Z0F0z11050.0L0S0t1U0_0{011Y1!1$1!0z1,1.1*0z0L0J0N1b1+0W1H0z0F0?1e0b0U0o0m0|0w011:1W010h0:0t0m1m0t1*2b2d2i1=2l1.2o0s2q040a0l0v0W0J0U0J0b0B1h1j0,290W0W0t0M2L1z2s0m1H0P272X0z2524260N2u0|1$0m2n2I1*1R1T0@1;2+0B2-0m211S1*0U2Q1H2V2X32142c1j2?2j2{0W180S110l0r2U3612352t381=3a3c3e0w3h2d3j2V2*013o0o3d040l0c3s2W133v3m0|3y3A0l0x3E3u363w3K3e0%3O3G3Q3I3x0J3b3z3e0H3V3k371V3n3!3p3B0n3)3H3,3J3.3$3B0e3=3X3@3Z3#3L0$3}3l3 3S040r0R443+2@403/0r3g1A3i3W454d470r3r4i3t4k4c393_3A0r3D4q3F3*3R4v110r3N4z3P4l4u414E3U4H4s4C4L483(4H1I301z2;2!0N2(3w0M212A0+1S1H2 0t313i3O054%0,4/4J1=0#0m110h2F0s4;3?4d0A3e513~4m4|044%0S1.2S0B1i1y4U522j543B564_0|4{110B1n3!0z3O0l4B3Y590,1v0t3V4P3Y0#110,0h5n4t1=5l5x5i57390h111x0z0d0L0 190~5L3w10040u5$5z110O0W0o0U0F5D5Q5o015(0Z5w5y46110b0J170-0d2_2K0B3z5+3 5(0G0y3V0l6f5x5j3n114%0g1.0g0W5h326h5R1=0J110!5|6i0|5(0E694d0s0B114a4H6s5^5H040h3!6y6t3J5 6Q5^0J5l2_6U5M6S045.5:5=6D2j5(0C6e6g5}4m6k0J6m0t6o6q4:6z5_116C5@6!3x5 612z5W650~68705%116-6J6:2j6v046x7e6|6F4E6.6f7f6j6N2m6Z3w7h7j6r7q6#5B1w6*1=5(0u0G7o6K71592w5?346|7h0V7D6#5:0U2n0N7S6}5)7Y596062760m66797O6R7Z7H4O6g7J3w6M0A1Y1.7u5z0L112x7Y7F7#4}7t7a3Y6b7|3 7h020O0z0K896E6G046I7-5^5(6d7;7=6/6|7$740-8g7g6w8w7r7M7Y7Q83042H0U1.0h5v866a117G7I7=7z016M6O0W8z6#0i0J0B2J0m8W016W5r8$7k7.596%5;7N6{7.6B8E7%75817c8o32068q907?5G5r5K8,5^596l6n6p8{046 8l7K118Y8!6Y8L4d6,8%7w7x3i923 7m8j9c8}4j919z9s6;5a6?9a6`3t8R8@9l399h8Z8#9c7d7y7P8y96717h0Y8%989E6^9b9K7E6~8^8u8K9f7b049Q9y9A908R7L859-3Y8D9%7T0U7V0m7X9}7Z5*a3599i9Oa3888p9=8R6M0t1$959R8-6=6@6_9c9e8=979M9j8+9`8M9/9o6w9q3t9B9L9Dam9$av9m9)a6737(9P9x4r9=9?6|6M2Q0z6oau9rae0M110X3z0b8;aP8r7.aT0-aW8%0#a!040Q0W7C4O1z4?4.4Va}0P4Y1z0z4!b22$2Y20222!0o1-a 4Y1F4^712Q0s0d0h0o0#0t0d0F0c111r1t5C0=aO2W1I3j1G0D2d0=1.0?0_0l0N000g1j8/5=0l2{371i2-0)0t0Z0l1i0l1g0:8!0t5/2K0?0-0z1/6O0m5ebY0o0i2R0?0F0o5C295t0b2db,290mbT1/2H6o0l0i0*0W0B2lb%0l2Jb^0o0MbL1/bJag1.0=5V0l5Y2c0W0~1/6?0l2c0b7R1MbA040I1j7V1g0lbi195C0W0l1vbKbM5/8:cq5Zct0BbPc42I0b0f2N0o0gci370k0@1/5s2c0B0WcA1P1K040j0S0l0k0l0o0l0*1v1S3z2n0M1/2n2#1/cnbI6^0)cx2F2 0B0*0z0*0b0y0l010pd8cTcs0~2h0-dn2-cxcZ0*0,cMc%c)0?c+bFc.0/0W01c=3jb00-0/0;04.

###(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

.128013s3_8èufvIy n7aêS1me(P24:twi]D[h)6Oo;bcdg/T0lqp.rF-,=k95Rxé050N0t0z0o0B0S0b0l0M0S0o0b0b0!010z0B0U010406050b0g0s0s0o0W0k040q0J0S0g0~0J0m0l020o0s0U0K0l0(0t180W0T0g0t0b050P1517191b130U041z1G051J0P1J1L1G130N0B0i0?0^0`0|0F0B0O0F0S1Z0F0z11050.0L0S0t1U0_0{011Y1!1$1!0z1,1.1*0z0L0J0N1b1+0W1H0z0F0?1e0b0U0o0m0|0w011:1W010h0:0t0m1m0t1*2b2d2i1=2l1.2o0s2q040a0l0v0W0J0U0J0b0B1h1j0,290W0W0t0M2L1z2s0m1H0P272X0z2524260N2u0|1$0m2n2I1*1R1T0@1;2+0B2-0m211S1*0U2Q1H2V2X32142c1j2?2j2{0W180S110l0r2U3612352t381=3a3c3e0w3h2d3j2V2*013o0o3d040l0c3s2W133v3m0|3y3A0l0x3E3u363w3K3e0%3O3G3Q3I3x0J3b3z3e0H3V3k371V3n3!3p3B0n3)3H3,3J3.3$3B0e3=3X3@3Z3#3L0$3}3l3 3S040r0R443+2@403/0r3g1A3i3W454d470r3r4i3t4k4c393_3A0r3D4q3F3*3R4v110r3N4z3P4l4u414E3U4H4s4C4L483(4H1I301z2;2!0N2(3w0M212A0+1S1H2 0t313i3O054%0,4/4J1=0#0m110h2F0s4;3?4d0A3e513~4m4|044%0S1.2S0B1i1y4U522j543B564_0|4{110B1n3!0z3O0l4B3Y590,1v0t3V4P3Y0#110,0h5n4t1=5l5x5i57390h111x0z0d0L0 190~5L3w10040u5$5z110O0W0o0U0F5D5Q5o015(0Z5w5y46110b0J170-0d2_2K0B3z5+3 5(0G0y3V0l6f5x5j3n114%0g1.0g0W5h326h5R1=0J110!5|6i0|5(0E694d0s0B114a4H6s5^5H040h3!6y6t3J5 6Q5^0J5l2_6U5M6S045.5:5=6D2j5(0C6e6g5}4m6k0J6m0t6o6q4:6z5_116C5@6!3x5 612z5W650~68705%116-6J6:2j6v046x7e6|6F4E6.6f7f6j6N2m6Z3w7h7j6r7q6#5B1w6*1=5(0u0G7o6K71592w5?346|7h0V7D6#5:0U2n0N7S6}5)7Y596062760m66797O6R7Z7H4O6g7J3w6M0A1Y1.7u5z0L112x7Y7F7#4}7t7a3Y6b7|3 7h020O0z0K896E6G046I7-5^5(6d7;7=6/6|7$740-8g7g6w8w7r7M7Y7Q83042H0U1.0h5v866a117G7I7=7z016M6O0W8z6#0i0J0B2J0m8W016W5r8$7k7.596%5;7N6{7.6B8E7%75817c8o32068q907?5G5r5K8,5^596l6n6p8{046 8l7K118Y8!6Y8L4d6,8%7w7x3i923 7m8j9c8}4j919z9s6;5a6?9a6`3t8R8@9l399h8Z8#9c7d7y7P8y96717h0Y8%989E6^9b9K7E6~8^8u8K9f7b049Q9y9A908R7L859-3Y8D9%7T0U7V0m7X9}7Z5*a3599i9Oa3888p9=8R6M0t1$959R8-6=6@6_9c9e8=979M9j8+9`8M9/9o6w9q3t9B9L9Dam9$av9m9)a6737(9P9x4r9=9?6|6M2Q0z6oau9rae0M110X3z0b8;aP8r7.aT0-aW8%0#a!040Q0W7C4O1z4?4.4Va}0P4Y1z0z4!b22$2Y20222!0o1-a 4Y1F4^712Q0s0d0h0o0#0t0d0F0c111r1t5C0=aO2W1I3j1G0D2d0=1.0?0_0l0N000g1j8/5=0l2{371i2-0)0t0Z0l1i0l1g0:8!0t5/2K0?0-0z1/6O0m5ebY0o0i2R0?0F0o5C295t0b2db,290mbT1/2H6o0l0i0*0W0B2lb%0l2Jb^0o0MbL1/bJag1.0=5V0l5Y2c0W0~1/6?0l2c0b7R1MbA040I1j7V1g0lbi195C0W0l1vbKbM5/8:cq5Zct0BbPc42I0b0f2N0o0gci370k0@1/5s2c0B0WcA1P1K040j0S0l0k0l0o0l0*1v1S3z2n0M1/2n2#1/cnbI6^0)cx2F2 0B0*0z0*0b0y0l010pd8cTcs0~2h0-dn2-cxcZ0*0,cMc%c)0?c+bFc.0/0W01c=3jb00-0/0;04.