Graphe et listes d'adjacence

On s'intéresse dans cet exercice à des graphes. On rappelle qu'un graphe est composé :

  • de sommets ;
  • d'arêtes reliant les sommets.

S'il existe une arête entre deux sommets, on dit qu'ils sont voisins.

Un graphe peut être :

  • non orienté : les arêtes sont des paires non ordonnées des sommets \(\{u;v\}\) non ordonnées. Dans ce cas, si l'arête \(u \rightarrow v\) existe alors l'arête \(v \rightarrow u\) existe elle aussi;
  • orienté : les arêtes sont des couples ordonnés de sommets \((u;v)\) et l'on parle plutôt d'arcs. L'arc \((u;v)\) indique que $\(u\) est un prédécesseur de \(v\) et que \(v\) est un successeur de \(u\). Il n'est toutefois pas certain que l'arc \((v;u)\) est existe et que \(u\) soit un voisin de \(v\).

Le graphe \(G\) ci-dessous est orienté : les arcs sont représentés par des flèches.

flowchart LR
    A([A]) --> B([B])
    B --> A
    A --> C([C])
    C --> D([D])
    C --> A
    B --> C

Comme on peut le voir l'arc \((C;D))\) existe mais pas l'arc \((D;C)\). Les autres arcs sont symétriques : ils existent dans les deux directions.

Le graphe \(H\) ci-dessous est non-orienté : les arêtes sont représentés par des traits pleins.

flowchart LR
    E([E]) --- F
    F([F]) --- G
    G([G]) --- E

Dans cet exercice, les graphes sont modélisés par leur liste d'adjacence. Celle-ci associe à chaque sommet la liste de ses voisins.

On représente les listes d'adjacence par des dictionnaires Python1 :

  • les clés sont les sommets ;
  • la valeur associée à une clé est la liste des sommets voisins du sommet correspondant à la clé.

Le graphe de l'exemple est ainsi représenté par le dictionnaire :

g = {
   "A": ["B", "C"], 
   "B": ["A", "C"], 
   "C": ["A", "D"], 
   "D": []
}
1. Représenter un graphe non orienté

Créer le dictionnaire g représentant le graphe non orienté dessiné ci-dessous :

flowchart LR
    L([Lycée]) --- M
    L([Lycée]) --- P([Piscine])
    S([Stade]) --- L
    M([Mairie]) --- P
    G([Gare]) --- M

Le test d'égalité effectué ne tient pas compte de l'ordre des voisins dans chaque liste.

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

.128013s3obcdufvgM/ly n7GapSr1Lme,P2=4:}ti][5h{é6050g0A0I0t0J0n0b0p0f0n0t0b0b0E010I0J0u010406050b0h0z0z0t0w0o040v0d0n0h0+0d0q050m0=0@0_0{0:0u04141b051e0m1e1g1b0:0g0J0j0Z0#0%0)0N0J0k0N0n1u0N0I0.050U0e0n0A1p0$0(011t1v1x1v0I1D1F1B0I0e0d0g0{1C0w1c0I0N0Z0~0b0u0t0q0)0D011H1r010i0W0A0q0t0z0A1B1)1+1:1J1?1F1_1{0.0a0p0C0w0d0u0d0b0J110q0p0S1%0w0w0A0f2g141~0q1c0m1#2t0I1Z1Y1!0g200)1x0q1^2d1B1m1o0!1I2D0J2F0q1V1n1B0u2m1c2r2t2X0;1*2h2L1;2Q0w0^0n0.0x2q2#0/2!1 2%1J2)2+0.0D2/1+2;2r2C012_0t2,040c2}2s0:302@0)33350F382 2#313e0.0M3h3a3j3c320d2*340.0Q3o2=2$1q2^3t2`040r3h1d2V142J2w0g2A310f1V1|1c3L1f3J2Z152:053Q0S2W3q3B3d0.0k3h0p3z310d0.0E3-3/3r0-040O3o0p3~3.3b3)010b1.04010y0o0f0P1|3H412M013`0G3@4e1;3`0L4d3(4f440.010l0V0w0J4c3Y2~3^423`0B4j4p1;4r460C0J0b0f2O4y2Z4k1J4D4F2?424I010v0U0S014o4V4f3`0K4E4z393 404G1J4X4u0J4w4P3Z4R0)4h4U3A4)0.4n4-3%4(4H4547494b4$544B51044,2X4:564=584K4M4O5c4Q4;4}0.5h2:5j50574s0s0_4`4A4|4g0.4+3}3 5e5z4J4L4N2F5q4{5s5G044i545x314m4%5y5l4s484a5D2s5L4S5u4 314?4v4x5R5E5T4*5v2~064/5-0)4X4Z0t4#5#5Z0.5W5i605U535r5k61585)5b663_5H5|4.5K5F4X5B2m5^5,5F4~5X6b5!5d6q584@4_6u555$5t045I543p6f5U0H3y0m3#0A2t2U6U3K1n3M2w2y2u1U1W2w0t1E6X0m3L0:6.0T0V0X04.
2. Représenter un graphe orienté

Créer le dictionnaire h représentant le graphe orienté dessiné ci-dessous :

flowchart LR
    D([David]) --> B
    A([Arthur]) --> B([Bertrand])
    B --> C
    A --> C([Caroline])
    C --> B

Le test d'égalité effectué ne tient pas compte de l'ordre des voisins dans chaque liste.

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

.128013s3obcdufvg/ly nABapSr1me,P2=4:C}ti]D[5h{6050g0y0H0s0I0m0b0o0f0m0s0b0b0C010H0I0t010406050b0h0x0x0s0v0n040u0d0m0h0*0d0p050l0;0?0^0`0/0t04131a051d0l1d1f1a0/0g0I0j0Y0!0$0(0N0I0k0N0m1t0N0H0-050T0e0m0y1o0#0%011s1u1w1u0H1C1E1A0H0e0d0g0`1B0v1b0H0N0Y0}0b0t0s0p0(0B011G1q010i0V0y0p0s0x0y1A1(1*1/1I1=1E1^1`0-0a0o0A0v0d0t0d0b0I100p0o0R1$0v0v0y0f2f131}0p1b0l1!2s0H1Y1X1Z0g1 0(1w0p1@2c1A1l1n0Z1H2C0I2E0p1U1m1A0t2l1b2q2s2W0:1)2g2K1:2P0v0@0m0-0w2p2!0.2Z1~2$1I2(2*0-0B2.1*2:2q2B012^0s2+040c2|2r0/2 2?0(32340D372~2!303d0-0M3g393i3b310d2)330-0P3g1c2U132I2v0g2z300f1U1{1b3B1e3z2Y142/053G0R2V3p1p2@0-0N3g0o2;2#3V0(0d0-0C3Z3#300,040O3n0o3?3!3a3%010b1-04010q0v1!0h0v013x3_2L013/0E3,471:3/0L463U483|0-010r0y410v1*0g453O2}3-3q3/0z4c4i1:4k3~0F0^0}2N1{4h2=3`3/0J4z4u383@3^4B1I4D4m4o2w4r4t2Y4d1I4a4A4L484f4K3$4j3}014F292D4J4Q3T4+4e0-4O3=3@4w3`4W4?4H2E4#3P4%0(4)4`4T4|4(0-4g4`524:4l4n4p4!4.3.4~4P2W064S5k4C4;0K0s0j0I4s5q4x0-4b5d5x5g045i4$4U0(4W5n4Z0p5E5j5a495s3n5K5b0-0G5!0l3R0y2s2T5,3A1m3C2v2x2t1T1V2v0s1D5/0l3B0/5 0S0U0W04.

La représentation des graphes à l'aide de dictionnaires dont les valeurs sont des listes a un inconvénient : deux dictionnaires différents peuvent représenter le même graphe sans être égaux pour Python. En effet, si deux listes de voisins ont les mêmes éléments dans un ordre différent alors elles sont différentes.

Considérons le graphe ci-dessous :

flowchart LR
    A([A]) --- B
    B([B]) --- C([C])

Les deux dictionnaires g et h représentent ce graphe et pourtant on a g != h :

Deux représentations
g = {
    "A": ["B"],
    "B": ["A", "C"],  # A puis C
    "C": ["B"],
}
h = {
    "A": ["B"],
    "B": ["C", "A"],  # C puis A
    "C": ["B"],
}
print(g == h)  # affiche False
3. « Égalité » de graphes

Ecrire la fonction graphes_egaux qui prend en paramètres deux dictionnaires g et h représentant des listes d'adjacences et renvoie le booléen indiquant s'ils représentent le même graphe (mêmes sommets et mêmes arêtes).

On garantit que les valeurs de tous les sommets sont comparables. On peut donc trier la liste de voisins d'un sommet particulier en faisant par exemple sorted(g[sommet]).

La fonction graphes_egaux doit être « symétrique » : egaux(g, h) et graphes_egaux(h, g) doivent toujours renvoyer le même résultat.

Exemples
>>> g = {
...     "A": ["B"],
...     "B": ["A", "C"],  # A puis C
...     "C": ["B"],
... }
>>> h = {
...     "A": ["B"],
...     "B": ["C", "A"],  # C puis A
...     "C": ["B"],
... }
>>> faux_h = {
...     "A": ["B"],
...     "B": ["C"],  # il manque A
...     "C": ["B"],
... }
>>> graphes_egaux(h, g)
True
>>> graphes_egaux(g, h)
True
>>> graphes_egaux(g, faux_h)
False
>>> graphes_egaux(faux_h, g)
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

.128013s3_ufvIy n7aêS1me(P24C:twi][h)6Oo;bcdUgx/TlàqABp!.rFL-,}=+k5R{é050L0r0y0m0A0R0b0j0K0R0m0b0b0)010y0A0W010406050b0e0q0q0m0Z0i040o0H0R0e130H0k0j020m0q0W0I0j0-0r1d0Z0T0e0r0b050P1a1c1e1g180W041E1L051O0P1O1Q1L180L0A0g0{0}0 110D0A0N0D0R1(0D0y16050?0J0R0r1Z0~10011%1)1+1)0y1;1?1/0y0J0H0L1g1:0Z1M0y0D0{1j0b0W0m0k110u011^1#010f0^0r0k1r0r1/2g2i2n1`2q1?2t0q2v040a0j0t0Z0H0W0H0b0A1m1o0;2e0Z0Z0r0K2Q1E2x0k1M0P2c2$0y2a292b0L2z111+0k2s2N1/1W1Y0|1_2:0A2=0k261X1/0W2V1M2!2$37192h1o2{2o300Z1d0R160p2Z3b173a2y3d1`3f3h160u3l2i3n2!2/013s0m3i040c3w2#183z3q113C3E0v3H3y3b3A3N160,3Q3J3S3L3B0H3g3D160F3X3o3c1!3r3$3t040l3Q1N351E2_2)0L2-3A0K262F0:1X1M340r363m3@400;483p3.110+160;0f3@3K4f010z160j4l3Z4n0k0f160N0Z0m0W0D1C0d0r0N0m0e0O4s4e2|0115040s4K3-4M0k4x4R3A4O0%3Q4r4m4T160D4W3!4O0E0x3X0j4:4#4t4M4h040A4k1F3m4=4L3e4V4|3x3,3A0H160Y4*4u160+0r0i1D522#544+160s0E4!5i4n56040X0)5n4$50044)5g4d4S2o5q585z5o4%045c5e594M4O5l4.5z064;5S4~5B1`4^2V0y0e0Z0k5u4?2o0+0K160!3D0b0r4/4;5G5)160f3$5%4 3r160b0H1c0=5{5V110H4p4_5$5z5U3T51395v1`4O5P375R5T4:5?5W164`633T0J5~3$0y0r0L5L2o5N6z5}040N6C114O0C6G3B6u610y6K4O0B5m6a6n65165s6r3!0k6t045 0Z6w6y5F6f6H5k6K4U5x6P166J6+5(6D5 6N6=046R6i3m6k6l5S6U015X0=5!69376b3!5*5,5.5:5Q746,76165Y796Y4n7e040Q0Z1B3+0P4b473^7z0P3{1E0y3}7E2+2%25272)0m1=7B3{1K5A3A2V0q0d0f0m5c0d0D0c161w1y1A1C0j70531R3n1L0#0m2T2V2X0A1n0j2*0A1@0K0D0m0K0e2=0j0;0`1+0b6w0`2S0g0H0A2O0k0b0Y0j0w0=6w0j5 1k2Q0j0W0r1l0j0n2*1@2~0r0f2q0K821@2O0j1?888g8b8p1n0y861@4y2i877|0@0R8K8k1N7:040h0R0j1C8Q0W1k0`8C8E8G8R2e1s6w0Z8J1@300q0J2V86004A2h0Z2P7`8i8?800m7*0j8e8g2~0j4H8p0r9g8V898N5P1U432`4n1|1*1,1.7S3!2B2s2u162H0o0K950W8Q0t0i2c1n3@465A38497y9y7q4i8C6K674r6^5|3M4w6E4z4B4D4F4H4J9#644N6.9:6c6E6}4Z6T7k6:5y6e6_6-044-5;6m7k4^6q9|a16L9_9@3!5D6/5b5d5fa09$9=4P6S7b755q6Xaaam9~6Kagae5a5Iaj6}5Oa55T75775Z5#7p4@5+045-0_7h6j7jab4^5_0ZaL5w6{2E6Oau9;666p7a4}756:6Faz5M167-3I737caA931e961n0b0da/aq7k5q5ta%4X160.0(aFaTamaV5`b66Z169e8haY1`a)68bl3M6d497k6Iah6$60a#6}0Ba?17a^bc9;a84{b2ab6:bj2~bp01bn30a$bIambnbMbga`0W94a}8ib06}bB72bDbE9^a{952Qa b1bsabbua:5wbLa+53bt160BbNb4bN0q0A3jbb73aH160raQb%c6b*a-16b-b!b:6}6@al9;bK8fbkb^6gb~c0160*b5bS9;c3c57ic79}cgbYa|b/7!cu04cxa,b}04b9cda_4@5^bfcy9^b`c067bVcWbh6;cra2clb=av6Mbyc)anbAcRb+7d6pbHcNbJbicpc#c{bT67bQcZa*bN6:chcI9 c,9;6hc?cDc|04d897a dab|b?6?bvcYc:6QcKcM3xcS2ocA043kcCcea7c9cbdra=de6lcfdhcGb.djcJdG04c+dmc-04dqcmb76~cKcwc2c4dzcRc84_c`dvdKdia~b$bW4Masdu2#dw6Dd/b#dl5hcOb(b*a6aU7m78aKd=5)aNaP5/aFd*7ne7c$7qaN7t7v5Q1E9T7A2$7Q050D2a7R0M854H8z0j2V340/5/0k0?8s8V8T9+0`8u3g0=8?0Z0/0N1?8`ey7U2s0y8k8(8*8a8*1o8:eO2M0 0A7Oe%2I9L0D7{0L001l0^8g0r8`84860A7_1n2t0A900L2i880r7*8)8K1ZeD8OeF8*8Y7+4He,8R8cf02Qf32V8c8P8{0`0|fe5 fgfcb`8c0e8O6N2e8i0A0L0/eQ8k0#7+0g3D8v0Z8c7+051xbw0e5ffW0$1Wf10kfq7+8u0e0geX8xezfa400k7*8j8#7RfN0jeJ4Cfm8h0/8t8.0j818w5/4z2P9h0R3$0`eBeQeE0yg1947,f_9r3A9u1~1-2wab9A2D2F9E9G149Je;9N5F9P3,9R53eocEadehd?16d^04d`a20.6K0b0p16000U00cce8cscPgSgU04000VgYdQbBgP01dydAdX5j040(9{gK2ogTgVg+gZg{g#gRc:g}g)gXh0d0czd%g=dbdYg`h93Ah5000wg,g?4nddg!11g;6}g_bNhihkh8d-cOh3hm4Mhig g-d$cBhB6A160(baem7k0Kg(030j0HfD3+gId~gOargMbN4OhAhd3!hih7hFhpanh%dT9;hDhlh(hndHh-hrdQhth-h=hxd_75h$g%gVhwh,h1hqhb9`hug(gWh?h:dYg.75h{hIg#h}i801hvifd dn04iihzi4g)hEila2ivabikh@a;g^hM6jen412$gD7C44f`7?401s1e0@fyfme f%f)0`0ke^13892i8,0~8J003$0Lf57+fw0b0%hS1o7?0J7~1o059T0N0j0)0)g4iK4c5E9q1L0G1o2M5!g88Q2s2q1oe_89e|iXfV0q042s5/8~8K1EfW0j0s2S0y0i8u4r7ygn1,gp9xa-6#5/bR497xiL0E9hjieP4F2K0eeMfu9dc~98e@e~a!0=8k8m208H2*0e2X5!1@2S0Lf20/f*gfeXj=8v0O9hfPeF0m0Nf*1eeA936v9h4I8J8M7+9p3n0e0R3n1+jqfie#8Q301oi/j^1@eO0Ri.0Zi:j=002~g7eHfOj!i#92861n0K8ti,e@0A1s6v2i0K0r9{kk18kk1?7|8+91b-6w2t0kkS91e~0/0R0/2Efg0S0je~jr1xe.5/0j7Xg92skZ1sfva~0?fg0sf=2*0@eWfg9.kc8af*hT8`8Kfafck*8bko0/kSe,6wi^f698kY0Wf4j}fv0~ls1@1+90kvk^jtly9dfQ5!0b0E5EkV1Ekh8$jbka4zgagcgk7/1V1XjF1}9wgramgt9C2G0j9F9Hgz9Mb{5hgD395FgHdgb;hyabc1h-i3h4idh+iAaniCamm2m6h h|hfl~ammcm6hoiomaiFg|m4ir9UiGmei17kiqhsmshYmuidi6mih_mkb8ixg*mpi2hKiI71j67BiNer7C0=8X0b04.

###(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_ufvIy n7aêS1me(P24C:twi][h)6Oo;bcdUgx/TlàqABp!.rFL-,}=+k5R{é050L0r0y0m0A0R0b0j0K0R0m0b0b0)010y0A0W010406050b0e0q0q0m0Z0i040o0H0R0e130H0k0j020m0q0W0I0j0-0r1d0Z0T0e0r0b050P1a1c1e1g180W041E1L051O0P1O1Q1L180L0A0g0{0}0 110D0A0N0D0R1(0D0y16050?0J0R0r1Z0~10011%1)1+1)0y1;1?1/0y0J0H0L1g1:0Z1M0y0D0{1j0b0W0m0k110u011^1#010f0^0r0k1r0r1/2g2i2n1`2q1?2t0q2v040a0j0t0Z0H0W0H0b0A1m1o0;2e0Z0Z0r0K2Q1E2x0k1M0P2c2$0y2a292b0L2z111+0k2s2N1/1W1Y0|1_2:0A2=0k261X1/0W2V1M2!2$37192h1o2{2o300Z1d0R160p2Z3b173a2y3d1`3f3h160u3l2i3n2!2/013s0m3i040c3w2#183z3q113C3E0v3H3y3b3A3N160,3Q3J3S3L3B0H3g3D160F3X3o3c1!3r3$3t040l3Q1N351E2_2)0L2-3A0K262F0:1X1M340r363m3@400;483p3.110+160;0f3@3K4f010z160j4l3Z4n0k0f160N0Z0m0W0D1C0d0r0N0m0e0O4s4e2|0115040s4K3-4M0k4x4R3A4O0%3Q4r4m4T160D4W3!4O0E0x3X0j4:4#4t4M4h040A4k1F3m4=4L3e4V4|3x3,3A0H160Y4*4u160+0r0i1D522#544+160s0E4!5i4n56040X0)5n4$50044)5g4d4S2o5q585z5o4%045c5e594M4O5l4.5z064;5S4~5B1`4^2V0y0e0Z0k5u4?2o0+0K160!3D0b0r4/4;5G5)160f3$5%4 3r160b0H1c0=5{5V110H4p4_5$5z5U3T51395v1`4O5P375R5T4:5?5W164`633T0J5~3$0y0r0L5L2o5N6z5}040N6C114O0C6G3B6u610y6K4O0B5m6a6n65165s6r3!0k6t045 0Z6w6y5F6f6H5k6K4U5x6P166J6+5(6D5 6N6=046R6i3m6k6l5S6U015X0=5!69376b3!5*5,5.5:5Q746,76165Y796Y4n7e040Q0Z1B3+0P4b473^7z0P3{1E0y3}7E2+2%25272)0m1=7B3{1K5A3A2V0q0d0f0m5c0d0D0c161w1y1A1C0j70531R3n1L0#0m2T2V2X0A1n0j2*0A1@0K0D0m0K0e2=0j0;0`1+0b6w0`2S0g0H0A2O0k0b0Y0j0w0=6w0j5 1k2Q0j0W0r1l0j0n2*1@2~0r0f2q0K821@2O0j1?888g8b8p1n0y861@4y2i877|0@0R8K8k1N7:040h0R0j1C8Q0W1k0`8C8E8G8R2e1s6w0Z8J1@300q0J2V86004A2h0Z2P7`8i8?800m7*0j8e8g2~0j4H8p0r9g8V898N5P1U432`4n1|1*1,1.7S3!2B2s2u162H0o0K950W8Q0t0i2c1n3@465A38497y9y7q4i8C6K674r6^5|3M4w6E4z4B4D4F4H4J9#644N6.9:6c6E6}4Z6T7k6:5y6e6_6-044-5;6m7k4^6q9|a16L9_9@3!5D6/5b5d5fa09$9=4P6S7b755q6Xaaam9~6Kagae5a5Iaj6}5Oa55T75775Z5#7p4@5+045-0_7h6j7jab4^5_0ZaL5w6{2E6Oau9;666p7a4}756:6Faz5M167-3I737caA931e961n0b0da/aq7k5q5ta%4X160.0(aFaTamaV5`b66Z169e8haY1`a)68bl3M6d497k6Iah6$60a#6}0Ba?17a^bc9;a84{b2ab6:bj2~bp01bn30a$bIambnbMbga`0W94a}8ib06}bB72bDbE9^a{952Qa b1bsabbua:5wbLa+53bt160BbNb4bN0q0A3jbb73aH160raQb%c6b*a-16b-b!b:6}6@al9;bK8fbkb^6gb~c0160*b5bS9;c3c57ic79}cgbYa|b/7!cu04cxa,b}04b9cda_4@5^bfcy9^b`c067bVcWbh6;cra2clb=av6Mbyc)anbAcRb+7d6pbHcNbJbicpc#c{bT67bQcZa*bN6:chcI9 c,9;6hc?cDc|04d897a dab|b?6?bvcYc:6QcKcM3xcS2ocA043kcCcea7c9cbdra=de6lcfdhcGb.djcJdG04c+dmc-04dqcmb76~cKcwc2c4dzcRc84_c`dvdKdia~b$bW4Masdu2#dw6Dd/b#dl5hcOb(b*a6aU7m78aKd=5)aNaP5/aFd*7ne7c$7qaN7t7v5Q1E9T7A2$7Q050D2a7R0M854H8z0j2V340/5/0k0?8s8V8T9+0`8u3g0=8?0Z0/0N1?8`ey7U2s0y8k8(8*8a8*1o8:eO2M0 0A7Oe%2I9L0D7{0L001l0^8g0r8`84860A7_1n2t0A900L2i880r7*8)8K1ZeD8OeF8*8Y7+4He,8R8cf02Qf32V8c8P8{0`0|fe5 fgfcb`8c0e8O6N2e8i0A0L0/eQ8k0#7+0g3D8v0Z8c7+051xbw0e5ffW0$1Wf10kfq7+8u0e0geX8xezfa400k7*8j8#7RfN0jeJ4Cfm8h0/8t8.0j818w5/4z2P9h0R3$0`eBeQeE0yg1947,f_9r3A9u1~1-2wab9A2D2F9E9G149Je;9N5F9P3,9R53eocEadehd?16d^04d`a20.6K0b0p16000U00cce8cscPgSgU04000VgYdQbBgP01dydAdX5j040(9{gK2ogTgVg+gZg{g#gRc:g}g)gXh0d0czd%g=dbdYg`h93Ah5000wg,g?4nddg!11g;6}g_bNhihkh8d-cOh3hm4Mhig g-d$cBhB6A160(baem7k0Kg(030j0HfD3+gId~gOargMbN4OhAhd3!hih7hFhpanh%dT9;hDhlh(hndHh-hrdQhth-h=hxd_75h$g%gVhwh,h1hqhb9`hug(gWh?h:dYg.75h{hIg#h}i801hvifd dn04iihzi4g)hEila2ivabikh@a;g^hM6jen412$gD7C44f`7?401s1e0@fyfme f%f)0`0ke^13892i8,0~8J003$0Lf57+fw0b0%hS1o7?0J7~1o059T0N0j0)0)g4iK4c5E9q1L0G1o2M5!g88Q2s2q1oe_89e|iXfV0q042s5/8~8K1EfW0j0s2S0y0i8u4r7ygn1,gp9xa-6#5/bR497xiL0E9hjieP4F2K0eeMfu9dc~98e@e~a!0=8k8m208H2*0e2X5!1@2S0Lf20/f*gfeXj=8v0O9hfPeF0m0Nf*1eeA936v9h4I8J8M7+9p3n0e0R3n1+jqfie#8Q301oi/j^1@eO0Ri.0Zi:j=002~g7eHfOj!i#92861n0K8ti,e@0A1s6v2i0K0r9{kk18kk1?7|8+91b-6w2t0kkS91e~0/0R0/2Efg0S0je~jr1xe.5/0j7Xg92skZ1sfva~0?fg0sf=2*0@eWfg9.kc8af*hT8`8Kfafck*8bko0/kSe,6wi^f698kY0Wf4j}fv0~ls1@1+90kvk^jtly9dfQ5!0b0E5EkV1Ekh8$jbka4zgagcgk7/1V1XjF1}9wgramgt9C2G0j9F9Hgz9Mb{5hgD395FgHdgb;hyabc1h-i3h4idh+iAaniCamm2m6h h|hfl~ammcm6hoiomaiFg|m4ir9UiGmei17kiqhsmshYmuidi6mih_mkb8ixg*mpi2hKiI71j67BiNer7C0=8X0b04.

  1. la dénomination liste d'adjacence est utilisée dans des ouvrages de référence. Elle peut prêter à confusion car ici on met en œuvre de telles listes à l'aide de listes de dictionnaires. On pourrait aussi utiliser de listes de listes, des listes d'ensembles...