Coloration propre d'un graphe

La coloration d'un graphe est dit propre lorsque deux sommets voisins quelconques n'ont pas la même couleur.

La coloration du graphe ci-dessous est propre.

Coloration

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

Coloration propre

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, la graphe plus haut est représenté par: {0: [1, 2, 3], 1: [0, 4, 6, 7], 2: [0, 4], ...}.

La coloration du graphe est créée par un autre dictionnaire qui associe à chaque numéro de sommet une chaîne de caractères qui désigne sa couleur. Par exemple, la coloration du graphe plus haut est représentée par: {0: "jaune", 1: "bleu"", 2: "vert", ...}.

Compléter la fonction coloration_propre qui prend en paramètres un graphe graphe supposé connexe et un dictionnaire couleurs qui stocke les couleurs associées et renvoie True si la coloration du graphe est propre et False sinon.

Exemples
>>> g = {0: [1, 2], 1: [0, 2], 2: [0, 1]}
>>> couleurs = {0:"rouge", 1:"bleu", 2:"vert", 3:"jaune"}
>>> coloration_propre(g, couleurs)
True
>>> g = {0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2]}
>>> couleurs = {0:"rouge", 1:"rouge", 2:"vert", 3:"jaune"}
>>> coloration_propre(g, couleurs)
False

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

.128013ben,4vi[3mo5_tPhklpwTf(: cga=ryFS6]u/2)s1d050Q0c0o0C0h0s0O0z0A0s0C0O0O0D010o0h0t010406050O0K0k0k0C0E0F040H0l0s0K0+0l0d050L0=0@0_0{0:0t04051b141e0L1b0:0Q0h0g0Z0#0%0)0q0h0B0q0s1s0q0o0.050U0b0s0c1n0$0(011r1t1v1t0o1B1D1z0o0E1c0o0q0Z0~0O0t0C0d0)0M011F1p010w0W0c0d0C0k0c1z1Y1!1)1H1,1D1/1;0.0a0z0p0E0l0t0l0O0h110d0z0S1W0E0E0c0A29141@0d1c0L1U2m1R1T1S1A0Q1_0)1v0d1.261z1k1m0!1G2w0h2y0d0l2C1z0t2f1c2k2m2Q0;1Z2a2E1*2J0E0^0s0.0P2j2U0/2T1^2W1H2Y2!0.0M2(1!2*2k2v012/0C2#040j2?2l0:2_2-0)2|2~0f312^2U2`370.0m3a333c352{0l2Z2}0.0I3a1f2O142C2p0Q1T2u3k0A2K1=1c3v1d3t2S152)053B0S2P3j1o1H0r0.0S0w3r343Q0)0u0.0z3W3P2F2{0w0.3B0s3m0C290n2N242f3%2,3Y010-040x3_2V3{0d0.0B0E0C0t0q0c402`3}0e3a3$3X3)43043B0K1D0K0E0O4b3k3}0N0y3h0z4x4g3(1*3S040w3m4f2+414i0.0O0l0@0T4G4h1*0l3!042H4P4A2.4446484a3J2@4H4c0.4v4%324y4/4z3`3)4C4E0E4W4=2X0.0g0l0h27134-044;4I4R4T4V53553d4Z47494r3{3}0i5g4J044L4N0o5k1*3}0J4,2Q064:5x5b3k4C0h3V5a4)3k4j4l4n4p5q1H5i5L364}4 515O3|0.0J4`561H0l0.0D0D5X5c4k0l4m0c4o4q535F5h0.5j5:4Q4Y5m4M1;5p5^4X0)5s5u2)5w5y665;4?0.2f0o4o522Q5z3{0r0A0.0G2}0O4$5v4/684B6a0T6d5(5A6j040v0E0K6o64143M0c2m2N6H3u1l3w2p2s2n0C1C6K0L3v0:6U0T0V0X04.

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

.128013ben,4vi[3mo5_tPhklpwTf(: cga=ryFS6]u/2)s1d050Q0c0o0C0h0s0O0z0A0s0C0O0O0D010o0h0t010406050O0K0k0k0C0E0F040H0l0s0K0+0l0d050L0=0@0_0{0:0t04051b141e0L1b0:0Q0h0g0Z0#0%0)0q0h0B0q0s1s0q0o0.050U0b0s0c1n0$0(011r1t1v1t0o1B1D1z0o0E1c0o0q0Z0~0O0t0C0d0)0M011F1p010w0W0c0d0C0k0c1z1Y1!1)1H1,1D1/1;0.0a0z0p0E0l0t0l0O0h110d0z0S1W0E0E0c0A29141@0d1c0L1U2m1R1T1S1A0Q1_0)1v0d1.261z1k1m0!1G2w0h2y0d0l2C1z0t2f1c2k2m2Q0;1Z2a2E1*2J0E0^0s0.0P2j2U0/2T1^2W1H2Y2!0.0M2(1!2*2k2v012/0C2#040j2?2l0:2_2-0)2|2~0f312^2U2`370.0m3a333c352{0l2Z2}0.0I3a1f2O142C2p0Q1T2u3k0A2K1=1c3v1d3t2S152)053B0S2P3j1o1H0r0.0S0w3r343Q0)0u0.0z3W3P2F2{0w0.3B0s3m0C290n2N242f3%2,3Y010-040x3_2V3{0d0.0B0E0C0t0q0c402`3}0e3a3$3X3)43043B0K1D0K0E0O4b3k3}0N0y3h0z4x4g3(1*3S040w3m4f2+414i0.0O0l0@0T4G4h1*0l3!042H4P4A2.4446484a3J2@4H4c0.4v4%324y4/4z3`3)4C4E0E4W4=2X0.0g0l0h27134-044;4I4R4T4V53553d4Z47494r3{3}0i5g4J044L4N0o5k1*3}0J4,2Q064:5x5b3k4C0h3V5a4)3k4j4l4n4p5q1H5i5L364}4 515O3|0.0J4`561H0l0.0D0D5X5c4k0l4m0c4o4q535F5h0.5j5:4Q4Y5m4M1;5p5^4X0)5s5u2)5w5y665;4?0.2f0o4o522Q5z3{0r0A0.0G2}0O4$5v4/684B6a0T6d5(5A6j040v0E0K6o64143M0c2m2N6H3u1l3w2p2s2n0C1C6K0L3v0:6U0T0V0X04.