Recherche de chemins
Conventions pour cette partie
Dans les exercices suivants, nous utiliserons pour représenter les graphes des dictionnaires associant les sommets avec la liste de leurs voisins.
Pour les parcours en largeur, nous utiliserons des algorithmes itératifs.
Pour les parcours en profondeurs, nous utiliserons des algorithmes récursifs, la pile d'appel remplaçant la pile de la version itérative.
Les fonctions sur les files et piles sont déjà définies.
Les graphes suivants sont également déjà définis :
graphe 1 graphe 2 graphe 3 graphe 4 graphe 5
graphe1_dico = {
0 : [ 1 , 2 ],
1 : [ 2 ],
2 : [ 0 , 1 ],
3 : [ 1 , 2 ]
}
graphe2_dico = {
0 : [ 1 , 2 ],
1 : [ 3 ],
2 : [ 8 ],
3 : [ 2 , 4 ],
4 : [ 7 ],
5 : [ 0 ],
6 : [ 5 ],
7 : [ 5 ],
8 : [ 9 ],
9 : [ 2 ]
}
graphe3_dico = {
0 : [ 1 , 2 , 3 ],
1 : [ 0 , 3 ],
2 : [ 0 , 3 ],
3 : [ 1 ]
}
graphe4_dico = {
0 : [ 1 , 3 ],
1 : [ 2 ],
2 : [ 7 ],
3 : [ 4 ],
4 : [ 6 ],
5 : [ 0 ],
6 : [ 2 , 7 ],
7 : []
}
graphe5_dico = {
0 : [ 5 , 7 ],
1 : [ 3 ],
2 : [ 0 , 4 ],
3 : [ 2 ],
4 : [ 3 ],
5 : [],
6 : [ 5 ],
7 : [ 6 ]
}
Exercice 9 : existence d'un chemin (parcours en largeur itératif)
Compléter le code de la fonction existe_chemin
qui prend en paramètres un dictionnaire de listes de voisins graphe
et deux sommets depart
et arrivee
, et qui renvoie un booléen indiquant s'il existe un chemin allant de depart
à arrivee
.
On fera un parcours en largeur utilisant une file d'attente.
Exemples >>> existe_chemin ( graphe1_dico , 0 , 1 )
True
>>> existe_chemin ( graphe1_dico , 3 , 0 )
True
>>> existe_chemin ( graphe1_dico , 2 , 3 )
False
>>> existe_chemin ( graphe2_dico , 0 , 9 )
True
>>> existe_chemin ( graphe2_dico , 6 , 2 )
True
>>> existe_chemin ( graphe2_dico , 2 , 1 );
False
>>> existe_chemin ( graphe2_dico , 4 , 6 )
False
Indication
L'algorithme fonctionne de la façon suivante :
On marque tous les sommets à non vu
et on place depart
dans la file d'attente.
Tant que la file n'est pas vide :
On défile un sommet.
On regarde si on est arrivé.
On marque comme vus tous ses voisins non encore vus et on les mets dans la file d'attente.
On marque le sommet courant comme traité.
Version vide Version à compléter
.128013/1n5k9rw&_l:a"ugb 2,h6y.7x4pTif8So]};F){s=év[03t
mde(qcP010R0S0O0f0w0d0H0k0V0d0f0H0H0I0g0O0w0u0g000P010H0h0Q0Q0f090p000z0A0d0h0/0A0501030_0{0}100@0R0w0K0k0|09070R0A0a050-040g0k0H0O0p0d0S0-1k0i0w050e040q0r0S0Q0k041J1t0?0X1h0'0)0+0-0n0w0i0n0d1X0n0O0=010!0j1y1S0*0,0g1W1Y1!1Y0O1(1y1&0O09001'0n0'130H0u0f1q0g0l1t0(1,0-0x0$0S050f0Q0S1&22241+1U0g2c1y2f2h0=020k0W090A0u0A0H0w16050k0Y2009090S0V2D192k051|030O0n2Q1`1|2V1'0R2m1-1!052e2A1&1g1i292n2$2&2)1&0u2J1|2O2Q2@0^232E2+1-050A090|0d0=1L2N2{1P2O2!0-30320f34000k0l3724392{3b0g3d33350N3k2P0@3a2}3c313r3h0t3u3m2l3y3p3A3f35063E3w3n3H3q3K3h0o3N2`3G1T2~3J3g0k0r3V3x3Y3z3e3#0y3&3P3(3I3*35083-3X2a3:3B040M3@2|3/3R3g04043~3o420=043j1a383O3^2n4800043t4c3l4e403_4h043D4l3v3W4o4g3!493M4t3F4w3Z3;4i3U4B192;0S2Q2)2U0R2W2Z3H0V0A0Y2(1h1|4K2?383E014T0Y4!4f1-070=0Y0x3E0k4v470x0=0S0s0w1v0S0c0V0n1J1D4$3'3_0;000T533.4p0=0i090f0u50594)0-560m4/4;3Q4,0S23090O5i4D5k0=5m4B4:544g0=0}091h0S0S5v3o560F0e3N0k5Q5B5a5D002p4|0f1?2e0O5J5A5o3/0A0=0I5n5C2~0=5W0c0K0w0Y5K3H560T0F5P5R5&5b000Z5Y5+5T1-5(005*5%5,5x000G5@410=0H0A0{0Z6f550=5O6a650-0H27000b0U0h0A0O0D230&0K0h6w6y6A645j0g4+5V316J5w3p6h6j2h5u6q6K1o0=526W6Q055c5e5g5$2_6b0g560C5|5Q5~5U626V6*6r6,0=0L6m5U0Y5s6@4#6+560B6P3o67692@5S6K6t0=6G6z0D2e0k5Y5#055#7g6I4B0P5R7c6$4@055W6}1-5_7z3c5q717C6`005z7b6;5-5V2d0c7l5!6)736_5M6/7u3o6M0a1W1y773H6Y0030723l7X5p611v5:5=7S3l7L6c584I6+6%7N1y7P5Z7n7=2P7@7H5N7W7t857|6i6k7*2P7,5'5)7%6g004-2d7G7B7`6_7|5/7Q828o0=5{7r7t896+6M0w4.6#476S8d8j3_797a388g605F5H834(6Q566p2@7s8A8!856M2J0O0h09188G3H070V0=0v090h8T8Z8#8C4@0%8T858W888!8P2n6M0x6O8+8k0K0A4`6!7K6+7'9c8O8a6&5f5h8q6K566|9m7v008c6U8w000B8X4d919A924*6Z8F9d8r4@0!8e8U5L6{7G7|999b8*6^9n0=76978L5)8N7+857e6v6x7h6C0k6E7p0D9v9y4m9B9;9C7D617x8n9q9M579O0=9Q2B9S7T9U7I8K5U8t815#9v8y8Y9=9B9i619J9v9p9T9ra19g7?749Va7668i9X2n9%9,7j8u7o9'7qae91ah6?ak9~9s6T6l9{5^asawau68at6s6u9,1`0#0O0J9,7W8$0=8&8(a39#8C8.000E3f0H8?194&4L4J2=194N190O4Pa}1{a}0f1)a^034N0@b74Xb90Y0!0$0H00
.128013hP"b.=0o3[9)egf]xS1lmuq
Fd;yTs{:can4vpr6/ 587&_ikéw2t,(}010s0f0T0A0O0m0w0I0z0m0A0w0w08050T0O0E05000q010w0o0n0n0A0F0u000k0a0m0o0/0a0B010H0_0{0}100@0s0O0D0I0|0F0P0s0a0R0B0-0l050I0w0T0u0m0f0-1k0g0O0B0y0l070L0f0n0I0l1J1t0?0X1h0'0)0+0-030O0g030m1X030T0=010!061y1S0*0,051W1Y1!1Y0T1(1y1&0T0F001'030'130w0E0A1q050S1t0(1,0-0h0$0f0B0A0n0f1&22241+1U052c1y2f2h0=020I040F0a0E0a0w0O160B0I0Y200F0F0f0z2D192k0B1|0H0T032Q1`1|2V1'0s2m1-1!0B2e2A1&1g1i292n2$2&2)1&0E2J1|2O2Q2@0^232E2+1-0B0a0F0|0m0=1L2N2{1P2O2!0-30320A34000I0S3724392{3b053d33350b3k2P0@3a2}3c313r3h0C3u3m2l3y3p3A3f350J3E3w3n3H3q3K3h0G3N2`3G1T2~3J3g0I0L3V3x3Y3z3e3#0K3&3P3(3I3*350d3-3X2a3:3B0l093@2|3/3R3g0l0l3~3o420=0l3j1a383O3^2n48000l3t4c3l4e403_4h0l3D4l3v3W4o4g3!493M4t3F4w3Z3;4i3U4B192;0f2Q2)2U0s2W2Z3H0z0a0Y2(1h1|4K2?383E014T0Y4!4f1-0P0=0Y0h3E0I4v470h0=0f0j0O1v0f0N0z031J1D4$3'3_0;000V533.4p0=0g0F0A0E50594)0-560U4/4;3Q4,0f230F0T5i4D5k0=5m4B4:544g0=0}0F1h0f0f5v3o560e0y3N0I5Q5B5a5D002p4|0A1?2e0T5J5A5o3/0a0=085n5C2~0=5W0N0D0O0Y5K3H560V0e5P5R5&5b000Z5Y5+5T1-5(005*5%5,5x000x5@410=0w0a0{0Z6f550=5O6a650-0w27000M0p0o0a0T0t230&0D0o6w6y6A645j054+5V316J5w3p6h6j2h5u6q6K1o0=526W6Q0B5c5e5g5$2_6b05560W5|5Q5~5U626V6*6r6,0=0c6m5U0Y5s6@4#6+560i6P3o67692@5S6K6t0=6G6z0t2e0I5Y5#0B5#7g6I4B0q5R7c6$4@0B5W6}1-5_7z3c5q717C6`005z7b6;5-5V2d0N7l5!6)736_5M6/7u3o6M0R1W1y773H6Y0030723l7X5p611v5:5=7S3l7L6c584I6+6%7N1y7P5Z7n7=2P7@7H5N7W7t857|6i6k7*2P7,5'5)7%6g004-2d7G7B7`6_7|5/7Q828o0=5{7r7t896+6M0O4.6#476S8d8j3_797a388g605F5H834(6Q566p2@7s8A8!856M2J0T0o0F188G3H0P0z0=0v0F0o8T8Z8#8C4@0%8T858W888!8P2n6M0h6O8+8k0D0a4`6!7K6+7'9c8O8a6&5f5h8q6K566|9m7v008c6U8w000i8X4d919A924*6Z8F9d8r4@0!8e8U5L6{7G7|999b8*6^9n0=76978L5)8N7+857e6v6x7h6C0I6E7p0t9v9y4m9B9;9C7D617x8n9q9M579O0=9Q2B9S7T9U7I8K5U8t815#9v8y8Y9=9B9i619J9v9p9T9ra19g7?749Va7668i9X2n9%9,7j8u7o9'7qae91ah6?ak9~9s6T6l9{5^asawau68at6s6u9,1`0#0T0Q9,7W8$0=8&8(a39#8C8.000r3f0w8?194&4L4J2=194N190T4Pa}1{a}0A1)a^0H4N0@b74Xb90Y0!0$0w00
Exercice 10 : existence d'un chemin (parcours en profondeur récursif)
Compléter le code de la fonction récursive existe_chemin
qui prend en paramètres un dictionnaire de listes de voisins graphe
et deux sommets depart
et arrivee
, et qui renvoie un booléen indiquant s'il existe un chemin allant de depart
et arrivee
.
Il y a également un quatrième paramètre etat
qui est soit None
(par défaut) et un dictionnaire associant à chaque sommet son état. Ce paramètre est utilisé pour les appels récurisif.
On fera une version récursive suivant un parcours en profondeur.
Exemples >>> existe_chemin_rec ( graphe1_dico , 0 , 1 )
True
>>> existe_chemin_rec ( graphe1_dico , 3 , 0 )
True
>>> existe_chemin_rec ( graphe1_dico , 2 , 3 )
False
>>> existe_chemin_rec ( graphe2_dico , 0 , 9 )
True
>>> existe_chemin_rec ( graphe2_dico , 6 , 2 )
True
>>> existe_chemin_rec ( graphe2_dico , 2 , 1 );
False
>>> existe_chemin_rec ( graphe2_dico , 4 , 6 )
False
Explications de l'algorithme
L'algorithme fonctionne de la façon suivante :
Si l'état est #py None
, on marque tous les sommets à non vu
.
On regarde si on est arrivé.
Pour chaque voisin de depart
non encore vu :
On marque comme vu le voisin et on regarde s'il y a un chemin allant de ce voisin à arrivee
.
On marque depart
comme traité.
Version vide Version à compléter
.128013w}éifs=a3yed9
8S&70gp:n,)6_hro[;"tq2mF/]4xP lk51.vTcN({ub010e0d0A0a060L080K0S0L0a0808090z0A060n0z000g01080W0D0D0a0v0c000i0w0L0W0:0w0p010F0`0|0~110^0e060Q0K0}0v0M0e0w030p0.0O0z0K080A0c0L0d0.1l0m060p0o0O0P0k0d0D0K0O1K1u0@0Y1i0(0*0,0.0u060m0u0L1Y0u0A0?010#0X1z1T0+0-0z1X1Z1#1Z0A1)1z1'0A0v001(0u0(14080n0a1r0z0C1u0)1-0.070%0d0p0a0D0d1'23251,1V0z2d1z2g2i0?020K0J0v0w0n0w0806170p0K0Z210v0v0d0S2E1a2l0p1}0F0A0u2R1{1}2W1(0e2n1.1#0p2f2B1'1h1j2a2o2%2'2*1'0n2K1}2P2R2^0_242F2,1.0p0w0v0}0L0?1M2O2|1Q2P2#0.31330a35000K0C38253a2|3c0z3e34360b3l2Q0^3b2~3d323s3i0H3v3n2m3z3q3B3g360N3F3x3o3I3r3L3i0s3O2{3H1U303K3h0K0k3W3y3Z3A3f3$0h3'3Q3)3J3+360f3.3Y2b3;3C0O0l3^2}3:3S3h0O0O403p430?0O3k1b393P3_2o49000O3u4d3m1a2=0d2R2*2V0e2X2!3I0S0w0Z2)1i1}4p2@393F014y0Z4F4g1.0M0?0Z073F0K3X413`0p070?0d0I061w0d0t0S0u1K1E0t2K0S4H3(3`0=000U4/3/4W0?0m0v0a0n4)4^4M0.4=0q4S4U484P0d240v0A524V2o55574:4h0?0~0v1i0d0d5f3p5i4m2Q4T5k304Z0#5e5v4L5g1.0w0?095s3I0M0S0?0T185r5D583I4=0r0o3O0K5Z5x4_2o4O00064R5D5#533q5A0a5C2^5+5F0.1p0?4$5j5$4N5N005P2&5K3:4=5X5D0g5!695=59000!5/5{5,5H005J5*5T640?0V634`00080w0|0!6q5h0?665;6m3`0828000j0B0W0w0A0y240'0Q0W6H6J6L6g5?0z5&07326U6c6t6v5:396b3I5^5'196l5y3d4{4}505R2`6.0z4=045Y6a5Z6C5l6d5B6x1.4=0x746/000Z5c6&4n6^4=0G6!6)5I7i3:6E0?6R6K0y2f0K5/0A2f7v7p6T6769704N5_5)6B6^0p5a7c7l3`6i096k7G5|795n5p6?4G7f6z6|6}7C0.5&2K0A0W0v6,7Q5,5M0?0R0v0W7V3m685!7#6W0?6Y0v7L710Q0w4$1E7~5G035_7*6'7_7I004|4~515S7X00778h7R5-7a5b0~7d2Q7_7g6A4e6}6~6^5&5(85796e8r5E5t0?8k6@8m8c8183897e8m7g8C0z7N7P8a6^7n6G6I7q6N0K6P7y0y786_7Y7A8x7B7H5.8F8t8I8*8M822C8P8s8i7h6-8m7N8T8Z8(7s7u7w0d8(7Z8.6(3:8A7F8X8L4Z4#4%4'4)0D4+4-8*4=4@8l5,8c8e6=9s0?56919w0?8N8{9A009C7+6V8c7T0Q5q9I9K9i9E726f9v6V5V8v7?9d8x7_7%0!7(8|3i9&5~7/7;9c8b8;9I8J7W9j8o7K9X8H00909L3p939D6V958#6L1{0$0A059b8-8y8m9'7'7)8T7-000E3g087=3w1a4J4q4o2?1a4s1a0A4uaz1|az0a1*au0F4s0^aI4CaK0Z0#0%0800
.128013y5T3P/mké94
r"u7ei.0twocg;6]2ld Ff[nx1=_Nq(Sa)p:{8sh,b&v}010x0j0n0L0k0w0R0y0q0w0L0R0R0F0g0n0k0N0g000e010R0h09090L0f03000K0p0w0h0:0p0C01080`0|0~110^0x0k0W0y0}0f0a0x0p0o0C0.0E0g0y0R0n030w0j0.1l0r0k0C0O0E0l0i0j090y0E1K1u0@0Y1i0(0*0,0.0S0k0r0S0w1Y0S0n0?010#0U1z1T0+0-0g1X1Z1#1Z0n1)1z1'0n0f001(0S0(140R0N0L1r0g0v1u0)1-0.0A0%0j0C0L090j1'23251,1V0g2d1z2g2i0?020y070f0p0N0p0R0k170C0y0Z210f0f0j0q2E1a2l0C1}080n0S2R1{1}2W1(0x2n1.1#0C2f2B1'1h1j2a2o2%2'2*1'0N2K1}2P2R2^0_242F2,1.0C0p0f0}0w0?1M2O2|1Q2P2#0.31330L35000y0v38253a2|3c0g3e3436063l2Q0^3b2~3d323s3i0d3v3n2m3z3q3B3g36043F3x3o3I3r3L3i0t3O2{3H1U303K3h0y0i3W3y3Z3A3f3$0Q3'3Q3)3J3+360c3.3Y2b3;3C0E0m3^2}3:3S3h0E0E403p430?0E3k1b393P3_2o49000E3u4d3m1a2=0j2R2*2V0x2X2!3I0q0p0Z2)1i1}4p2@393F014y0Z4F4g1.0a0?0Z0A3F0y3X413`0C0A0?0j0D0k1w0j0G0q0S1K1E0G2K0q4H3(3`0=000J4/3/4W0?0r0f0L0N4)4^4M0.4=0T4S4U484P0j240f0n524V2o55574:4h0?0~0f1i0j0j5f3p5i4m2Q4T5k304Z0#5e5v4L5g1.0p0?0F5s3I0a0q0?0H185r5D583I4=0M0O3O0y5Z5x4_2o4O000k4R5D5#533q5A0L5C2^5+5F0.1p0?4$5j5$4N5N005P2&5K3:4=5X5D0e5!695=59000!5/5{5,5H005J5*5T640?0P634`000R0p0|0!6q5h0?665;6m3`0R28000V0I0h0p0n0s240'0W0h6H6J6L6g5?0g5&0A326U6c6t6v5:396b3I5^5'196l5y3d4{4}505R2`6.0g4=0X5Y6a5Z6C5l6d5B6x1.4=0B746/000Z5c6&4n6^4=0u6!6)5I7i3:6E0?6R6K0s2f0y5/0n2f7v7p6T6769704N5_5)6B6^0C5a7c7l3`6i0F6k7G5|795n5p6?4G7f6z6|6}7C0.5&2K0n0h0f6,7Q5,5M0?050f0h7V3m685!7#6W0?6Y0f7L710W0p4$1E7~5G0o5_7*6'7_7I004|4~515S7X00778h7R5-7a5b0~7d2Q7_7g6A4e6}6~6^5&5(85796e8r5E5t0?8k6@8m8c8183897e8m7g8C0g7N7P8a6^7n6G6I7q6N0y6P7y0s786_7Y7A8x7B7H5.8F8t8I8*8M822C8P8s8i7h6-8m7N8T8Z8(7s7u7w0j8(7Z8.6(3:8A7F8X8L4Z4#4%4'4)094+4-8*4=4@8l5,8c8e6=9s0?56919w0?8N8{9A009C7+6V8c7T0W5q9I9K9i9E726f9v6V5V8v7?9d8x7_7%0!7(8|3i9&5~7/7;9c8b8;9I8J7W9j8o7K9X8H00909L3p939D6V958#6L1{0$0n0b9b8-8y8m9'7'7)8T7-000z3g0R7=3w1a4J4q4o2?1a4s1a0n4uaz1|az0L1*au084s0^aI4CaK0Z0#0%0R00
Pour préparer les exercices suivants
Nous allons maintenant chercher à construire un chemin allant de depart
à arrivee
s'il existe.
Afin de tester les résultats, nous allons écrire une fonction qui permet de tester si un chemin permet d'aller de depart
à arrivee
dans un graphe donné.
Exercice 11 : tester si un chemin est valide
Écrire le code de la fonction chemin_valide
qui prend un dictionnaire graphe
correspondant à un graphe, une liste de sommets chemin
et deux sommets depart
et arrivee
et qui renvoie un booléen indiquant si le chemin permet d'aller de depart
à arrivee
dans graphe
.
Exemples >>> chemin_valide ( graphe1_dico , [ 0 , 1 , 2 ], 0 , 2 )
True
>>> chemin_valide ( graphe1_dico , [ 0 , 1 , 2 ], 0 , 3 )
False
>>> chemin_valide ( graphe1_dico , [ 0 , 1 , 3 ], 0 , 3 )
False
>>> chemin_valide ( graphe1_dico , [ 0 , 1 , 2 ], 1 , 2 )
False
>>> chemin_valide ( graphe2_dico , [ 6 , 5 , 0 , 1 , 3 , 4 , 7 ], 6 , 7 )
True
Version vide Version à compléter
.1280134/.7w(cam[Pivf3skT,2+d-1r)e
nlS=ogp"0b!]t:Fyu_h56010o0t0I0a0e0x0i0u090x0a0i0i0z0D0I0e0C0D000v010i0M0b0b0a0r0L000y0A0x0M0)0A0w01040:0=0@0_0.0o0e0f0u0?0r0j0o0A070w0'0q0D0u0i0I0L0x0t0'1e0B0e0w0J0q05060t0b0u0q1D1n0-0R1b0Z0#0%0'0O0e0B0O0x1R0O0I0,010U0F1s1M0$0&0D1Q1S1U1S0I1!1s1Y0I0r001Z0O0Z0|0i0C0a1k0D0m1n0!1&0'0g0W0t0w0a0b0t1Y1{1}1%1O0D261s292b0,020u0d0r0A0C0A0i0e100w0u0S1_0r0r0t092x132e0w1?040I0O2K1;1?2P1Z0o2g1'1U0w282u1Y1a1c232h2W2Y2#1Y0C2D1?2I2K2.0/1|2y2%1'0w0A0r0?0x0,0q2H2=1J2I2U0'2_2{0a2}000m311}332=350D372|0,0h3d2J0.342@362`3k00033n3f2f3r3i3t390,0P3x3p3g3A3j3D000Q3G2;3z1N2^3C3a063x132+0t2K2#2O0o2Q2T3A090A0S2!1b1?3Y2-323W3)0S3:3Q240D0j0,0S0g3x0u3P2?3R360g0,090O1D1x0N0f390e0S3W3q450D0+00084i3I4k0w0,0B0r0a0C4a4p3_2h4m0l41433h4s00494b12143;4j3`4C4E4O2h4H0S1|0r0I4z444P0,4D4M3e424S2^0,0@0r1b0t0t4Z3h4m0s0J3G0u4`4(4q3`3|000e404&2J4|4A2^0F0,2k4;3A4m4o543^4!4T484a0b1x5c4k4?4R4}2h0A0,0z0z5r571u0e0,0E5y5i1'1i0,2`5E4G5k4K5o4#000c5O2h5m5C5S1'4m0H5K3A5u000G5x5g565F363}0t4W4Y5(4F5#075I0r5!4r5M5m4L2:4)0'4m5R5g5;4k5$0p5W5A2~694l0,5Z5:600D5$5&5_3`4H4,4.4:646h4m4^5g0v4{6x5)3h502D0I0M0r5}326z3A0j090,0K390i6q2.6w4{654~0,0g5J6g5s4*516l5t5?516G4'6U4T59004v0w0B6Q4N6!610,5f5~6@3i6-5b6r6|5e6c4H4J5|6c5q715z6i0,687a5*0D5U00307f4=0,4@4_6y4`6+1'50526%6#765n7l5d0,636{7b4H0e6c5$0n6c7i7k7E7g5Y7w0'5H002_5/2.6I666'7z7X7s5+004u4w4y7A5p7C745{7#6?7b627.6$7+5P0H0H6u6R7q7q7%3{0,6C6E6)55826K6M6O6=3e6S7r6h6B0T867R3{6L000k0r0M8d3o133?3Z3X2,133#130I3%8B1=8B0a1#8w043#0.8K3-8M0S0U0W0i00
.128013PpT]hSyutk":.2r(/7Fm=-f4g31+v!aisc) 0
5bln_,o[de6w010N0O0b0x0y0H0z0C0A0H0x0z0z0n0d0b0y040d000E010z0a0m0m0x0h0900080L0H0a0)0L0I010j0:0=0@0_0.0N0y0v0C0?0h0c0N0L0Q0I0'0t0d0C0z0b090H0O0'1e0r0y0I0e0t0f0k0O0m0C0t1D1n0-0R1b0Z0#0%0'070y0r070H1R070b0,010U0G1s1M0$0&0d1Q1S1U1S0b1!1s1Y0b0h001Z070Z0|0z040x1k0d0g1n0!1&0'0p0W0O0I0x0m0O1Y1{1}1%1O0d261s292b0,020C030h0L040L0z0y100I0C0S1_0h0h0O0A2x132e0I1?0j0b072K1;1?2P1Z0N2g1'1U0I282u1Y1a1c232h2W2Y2#1Y042D1?2I2K2.0/1|2y2%1'0I0L0h0?0H0,0t2H2=1J2I2U0'2_2{0x2}000g311}332=350d372|0,0s3d2J0.342@362`3k000q3n3f2f3r3i3t390,0F3x3p3g3A3j3D000P3G2;3z1N2^3C3a0k3x132+0O2K2#2O0N2Q2T3A0A0L0S2!1b1?3Y2-323W3)0S3:3Q240d0c0,0S0p3x0C3P2?3R360p0,0A071D1x0J0v390y0S3W3q450d0+000i4i3I4k0I0,0r0h0x044a4p3_2h4m0K41433h4s00494b12143;4j3`4C4E4O2h4H0S1|0h0b4z444P0,4D4M3e424S2^0,0@0h1b0O0O4Z3h4m0B0e3G0C4`4(4q3`3|000y404&2J4|4A2^0G0,2k4;3A4m4o543^4!4T484a0m1x5c4k4?4R4}2h0L0,0n0n5r571u0y0,0D5y5i1'1i0,2`5E4G5k4K5o4#000M5O2h5m5C5S1'4m065K3A5u000w5x5g565F363}0O4W4Y5(4F5#0Q5I0h5!4r5M5m4L2:4)0'4m5R5g5;4k5$0o5W5A2~694l0,5Z5:600d5$5&5_3`4H4,4.4:646h4m4^5g0E4{6x5)3h502D0b0a0h5}326z3A0c0A0,0l390z6q2.6w4{654~0,0p5J6g5s4*516l5t5?516G4'6U4T59004v0I0r6Q4N6!610,5f5~6@3i6-5b6r6|5e6c4H4J5|6c5q715z6i0,687a5*0d5U00307f4=0,4@4_6y4`6+1'50526%6#765n7l5d0,636{7b4H0y6c5$0u6c7i7k7E7g5Y7w0'5H002_5/2.6I666'7z7X7s5+004u4w4y7A5p7C745{7#6?7b627.6$7+5P06066u6R7q7q7%3{0,6C6E6)55826K6M6O6=3e6S7r6h6B0T867R3{6L00050h0a8d3o133?3Z3X2,133#130b3%8B1=8B0x1#8w0j3#0.8K3-8M0S0U0W0z00
Vous pouvez utiliser cette fonction dans les exercices suivants
Reconstruire le chemin
Nous allons maintenant chercher à construire un chemin allant de depart
à arrivee
s'il existe. Lors du parcours en largeur, nous allons mémoriser le sommet par lequel nous sommes arrivés à chaque sommet visité. Nous devons donc faire une fonction qui permettra de reconstruire le chemin à partir des prédécesseurs.
Exercice 12 : reconstruire le chemin
Compléter le code de la fonction reconstruit_chemin
qui prend en paramètre un dictionnaire precedent
associant des sommets à d'autres sommets et deux sommets depart
et arrivee
, et qui renvoie un chemin allant de depart
à arrivee
.
On suppose que precedent
contient suffisamment d'information pour trouver un chemin allant de depart
à arrivee
.
Exemples >>> reconstruit_chemin ({ 0 : 1 , 1 : 2 , 2 : 3 }, 3 , 0 )
[3, 2, 1, 0]
>>> reconstruit_chemin ({ 1 : 2 , 2 : 4 , 3 : 0 , 4 : 0 }, 0 , 1 )
[0, 4, 2, 1]
Explications de l'algorithme
On commence par construire le chemin allant de arrivee
à depart
.
On dépile alors la liste obtenue (avec liste . pop ()
) et on construit le chemin final en même temps, comme lorsqu'on retourne une pile en la dépilant sur une autre.
Version vide Version à compléter
.128013c60m_.4/319tfsSy&dlo,(n!7[=;u)ar5P]eipgv w:"k
8b2h010k0C0e0x0D0l0g0H030l0x0g0g0t0K0e0D0E0K000M010g0v06060x0y0i000h0m0l0v0)0m0p010a0:0=0@0_0.0k0D0G0H0?0y0L0k0m0I0p0'0c0K0H0g0e0i0l0C0'1e0F0D0p0J0c080r0C060H0c1D1n0-0R1b0Z0#0%0'0Q0D0F0Q0l1R0Q0e0,010U0O1s1M0$0&0K1Q1S1U1S0e1!1s1Y0e0y001Z0Q0Z0|0g0E0x1k0K0P1n0!1&0'0f0W0C0p0x060C1Y1{1}1%1O0K261s292b0,020H0A0y0m0E0m0g0D100p0H0S1_0y0y0C032x132e0p1?0a0e0Q2K1;1?2P1Z0k2g1'1U0p282u1Y1a1c232h2W2Y2#1Y0E2D1?2I2K2.0/1|2y2%1'0p0m0y0?0l0,1F2H2=1J2I2U0'2_2{0x2}000H0P311}332=350K372|2~0b3e2J0.342@362`3l3b093o3g2f3s3j3u392~0z3y3q3h3B3k3E3b043H2;3A1N2^3D3a0H0r3P3r3S3t383V0N3Y3J3!3C3$2~0d3'3R243*3v0c053y132+0C2K2#2O0k2Q2T3B030m0S2!1b1?3`2-323^440S4b3/2h0L0,0S0f3y0H3Q2?3)0p0f0,2D440p1p0y0v2w07030Q1D1x3^3Z3:0+000o4H3(3:0p0,3`030C0S0p0e4N4h1'4K0n4n4p3i4Q000S1|0y4X144c4I2h4#4%4:2^0,0@0y1b0C0C4Y4q4J0,0w0J3H0H574o4@360,4D4F0p072D0e0m0v0y4?4O2h0m0,0t5m4Z0'4K0s504'4_2C4|4~4.3f4&3B4K0B56585F4r4_2F0v0C0l5s515o5q5S5y004`5B5J575L3:4j000I1Q1s5W3K5N0e5P5R5D2J595n1'5p000q5r5=3b5%2h4(4*0@4-2:5a0K4K555~0M586e5@5t3j5.5:5,3)5`5}2.6g5T4^004S4U28664/5^5u0,5w5~616s0x5O5Q5x5G0,5I6c6f5K684(5d061x5g0T5j5l6D685`086J5M5Y0E0E280k6%524L6,626j6I6Z6z69535#6q5X6S4G5~6{3B6n6l6-0s6M2.6d6P6@5'5)2774620O0,2k6/4!0,4M6?6h6R4E6T5f5h6X7k6A000w7f5_0,0j0F0e0u7A1u0D0,3@7o6r7x6b786O5$6Q5c7r6~676@6#7w6i6'6)0p6+7M3i4K7n7X7p7U5e6V5i5k7!7Z7(5-6t2s7!7*0w7z6N7a6h5'5h5k12706E5b006}8778134e3{3_2,133}130e408m1=8m0x1#8h0a3}0.8v488x0S0U0W0g00
.128013m,uie)0k25bnp6h 3:"a[lgP7w
o8=49(rfv&t]1s.c_!ySd;/010O070E0m060o0H0i0J0o0m0H0H0w0l0E060f0l000t010H0503030m0A0M000N0u0o050)0u0e010Q0:0=0@0_0.0O060C0i0?0A0a0O0u0s0e0'0G0l0i0H0E0M0o070'1e0p060e0k0G0I0r07030i0G1D1n0-0R1b0Z0#0%0'0h060p0h0o1R0h0E0,010U0d1s1M0$0&0l1Q1S1U1S0E1!1s1Y0E0A001Z0h0Z0|0H0f0m1k0l0b1n0!1&0'0B0W070e0m03071Y1{1}1%1O0l261s292b0,020i0q0A0u0f0u0H06100e0i0S1_0A0A070J2x132e0e1?0Q0E0h2K1;1?2P1Z0O2g1'1U0e282u1Y1a1c232h2W2Y2#1Y0f2D1?2I2K2.0/1|2y2%1'0e0u0A0?0o0,1F2H2=1J2I2U0'2_2{0m2}000i0b311}332=350l372|2~0j3e2J0.342@362`3l3b0x3o3g2f3s3j3u392~0c3y3q3h3B3k3E3b0g3H2;3A1N2^3D3a0i0r3P3r3S3t383V0v3Y3J3!3C3$2~0y3'3R243*3v0G093y132+072K2#2O0O2Q2T3B0J0u0S2!1b1?3`2-323^440S4b3/2h0a0,0S0B3y0i3Q2?3)0e0B0,2D440e1p0A052w0K0J0h1D1x3^3Z3:0+000z4H3(3:0e0,3`0J070S0e0E4N4h1'4K044n4p3i4Q000S1|0A4X144c4I2h4#4%4:2^0,0@0A1b07074Y4q4J0,080k3H0i574o4@360,4D4F0e0K2D0E0u050A4?4O2h0u0,0w5m4Z0'4K0n504'4_2C4|4~4.3f4&3B4K0F56585F4r4_2F05070o5s515o5q5S5y004`5B5J575L3:4j000s1Q1s5W3K5N0E5P5R5D2J595n1'5p000L5r5=3b5%2h4(4*0@4-2:5a0l4K555~0t586e5@5t3j5.5:5,3)5`5}2.6g5T4^004S4U28664/5^5u0,5w5~616s0m5O5Q5x5G0,5I6c6f5K684(5d031x5g0T5j5l6D685`0I6J5M5Y0f0f280O6%524L6,626j6I6Z6z69535#6q5X6S4G5~6{3B6n6l6-0n6M2.6d6P6@5'5)2774620d0,2k6/4!0,4M6?6h6R4E6T5f5h6X7k6A00087f5_0,0D0p0E0P7A1u060,3@7o6r7x6b786O5$6Q5c7r6~676@6#7w6i6'6)0e6+7M3i4K7n7X7p7U5e6V5i5k7!7Z7(5-6t2s7!7*087z6N7a6h5'5h5k12706E5b006}8778134e3{3_2,133}130E408m1=8m0m1#8h0Q3}0.8v488x0S0U0W0H00
Vous pouvez utiliser cette fonction dans les exercices suivants
Exercice 13 : recherche d'un chemin (parcours en largeur itératif)
Compléter le code de la fonction trouve_chemin
qui prend en paramètres un dictionnaire de listes de voisins graphe
et deux sommets depart
et arrivee
, et qui renvoie la liste des sommets formant un chemin allant de depart
à arrivee
. S'il n'y a pas de chemin, la fonction renvoie une liste vide.
On fera un parcours en largeur utilisant une file d'attente.
Selon les graphes, la solution n'est pas forcément unique. La solution que vous trouverez ne sera pas forcément la même que dans les exemples. Par contre, avec un parcours en largeur, le chemin trouvé est toujours de longueur minimale.
Exemples >>> trouve_chemin ( graphe2_dico , 0 , 5 )
[0, 1, 3, 4, 7, 5]
>>> trouve_chemin ( graphe2_dico , 6 , 9 )
[6, 5, 0, 2, 8, 9]
>>> trouve_chemin ( graphe1_dico , 0 , 2 )
[0, 2]
>>> trouve_chemin ( graphe1_dico , 0 , 3 )
[]
Version vide Version à compléter
.128013]4.0cah}d)(y1tNik,v3[=:2b"swerS
/u _86pl5{o9gPmf7n010b0v0g080i0G0t0B070G080t0t0o0s0g0i0F0s000y010t0A0N0N080w0e000x0J0G0A0)0J0Q010z0:0=0@0_0.0b0i0l0B0?0w0j0b0J0u0Q0'0f0s0B0t0g0e0G0v0'1e0L0i0Q0p0f050P0v0N0B0f1D1n0-0R1b0Z0#0%0'090i0L090G1R090g0,010U0r1s1M0$0&0s1Q1S1U1S0g1!1s1Y0g0w001Z090Z0|0t0F081k0s0q1n0!1&0'0O0W0v0Q080N0v1Y1{1}1%1O0s261s292b0,020B0M0w0J0F0J0t0i100Q0B0S1_0w0w0v072x132e0Q1?0z0g092K1;1?2P1Z0b2g1'1U0Q282u1Y1a1c232h2W2Y2#1Y0F2D1?2I2K2.0/1|2y2%1'0Q0J0w0?0G0,1F2H2=1J2I2U0'2_2{082}000B0q311}332=350s372|2~0m3e2J0.342@362`3l3b043o3g2f3s3j3u392~0H3y3q3h3B3k3E3b0E3H2;3A1N2^3D3a0B0P3P3r3S3t383V0D3Y3J3!3C3$2~0K3'3R243*3v0f063.2?3)3L3a0f0f3^3i3{0,0f3d14323I3/2h42000f3n463f483_3:4b0f3x4f2J132+0v2K2#2O0b2Q2T3B070J0S2!1b1?4q2-323y014z0S4G491'0j0,0S0O3y0B3Q4i4a0O0,1;0J0A0l0v0C07091D1x4I3Z3:0+000d4,3(4j0,0L0w080F4)4=4N0'4/0k4T4V414Q0v1|0w0g4~4W1'52544-4a0,0@0w1b0v0v5c3i4/0c0p3H0B5v4U5h2^0,2j4&081-280g5o4n3b553B0J0,0o5g4?5i005B0C0l0i0S5p3B4/0d0c5u5w5K3`0,4q070v0S0Q5b5I5x5Q1'5M005O5:5'4.0,0I5Y5(000t0J0=0T605|005t5`5y0'0j070,0h115H2.5;500s4P5S2`5P6m0Q0,63655/6k5{2h1i0,4+6b5=364^4`4|6j4H6c0s4/0a5%5v6z5z00285B672h5!6X6T0S596x6L6F6N0,536E6s5A270C5D5G5.6K3f6S510,5$5I0y5w6l5d6d0,0u1Q1s6r720s6B002_6&3f71566U1p5U5W6@4o6M6Z5I6_3j6.1s6:5E6?6!6`005s6Q707g3K6u642b7e2J7E3)5@5_6y6M6t004R277y6)4:7V7R5T6;5F7m4M795r7C707r6o0i4S6,797R6v7I783i7N7O327L4@005k5m7%7r4/6a2.6~7D887+0,2D0g0A0w127/7h2D4z0Q1p0w0A2w4'4)0N6D2:7o0,4;7q7Q5)8j5,5F7V5f8h7F7S580@7J7&5q6*7@8H804%828v7A7)5&6M6o0v0X8T6(848W898Y5A6q8G610l0J0i2v8g7P6(7b8t7{7r7R4_4{4}8y8%0,0n7Y7G6w8E0,038547889d8X6(7,7.8?6-005*8C5.980094919k8.8:8_6^8U038P7M0u6C0t9A3:6e6g6i9p9b4g9e9N9f9k6V7U9s7'8w95009u8;9p6+9j7:7t5C7w5G9p6|869O9O8{8A2E9n8L83939W9Y9w7n92009z8,3:7N9F5R7=666}7*8)008c8e8=8`8U0na086134K4r4p2,134t130g4var1=ar081#am0z4t0.aA4DaC0S0U0W0t00
.128013,6/vhl.sw([go nkP]y)au8tcpm10_e25:{Nd"}rSfi
=97b43010D0x0q0n0J080a0g0r080n0a0a0L0E0q0J0s0E000K010a0o0t0t0n0G0l000H0f080o0)0f0h01050:0=0@0_0.0D0J060g0?0G0i0D0f0b0h0'0u0E0g0a0q0l080x0'1e0e0J0h0A0u090N0x0t0g0u1D1n0-0R1b0Z0#0%0'070J0e07081R070q0,010U0O1s1M0$0&0E1Q1S1U1S0q1!1s1Y0q0G001Z070Z0|0a0s0n1k0E0y1n0!1&0'0I0W0x0h0n0t0x1Y1{1}1%1O0E261s292b0,020g0j0G0f0s0f0a0J100h0g0S1_0G0G0x0r2x132e0h1?050q072K1;1?2P1Z0D2g1'1U0h282u1Y1a1c232h2W2Y2#1Y0s2D1?2I2K2.0/1|2y2%1'0h0f0G0?080,1F2H2=1J2I2U0'2_2{0n2}000g0y311}332=350E372|2~0Q3e2J0.342@362`3l3b0P3o3g2f3s3j3u392~0z3y3q3h3B3k3E3b043H2;3A1N2^3D3a0g0N3P3r3S3t383V0p3Y3J3!3C3$2~0M3'3R243*3v0u0v3.2?3)3L3a0u0u3^3i3{0,0u3d14323I3/2h42000u3n463f483_3:4b0u3x4f2J132+0x2K2#2O0D2Q2T3B0r0f0S2!1b1?4q2-323y014z0S4G491'0i0,0S0I3y0g3Q4i4a0I0,1;0f0o060x0w0r071D1x4I3Z3:0+000c4,3(4j0,0e0G0n0s4)4=4N0'4/034T4V414Q0x1|0G0q4~4W1'52544-4a0,0@0G1b0x0x5c3i4/0m0A3H0g5v4U5h2^0,2j4&0n1-280q5o4n3b553B0f0,0L5g4?5i005B0w060J0S5p3B4/0c0m5u5w5K3`0,4q0r0x0S0h5b5I5x5Q1'5M005O5:5'4.0,0B5Y5(000a0f0=0T605|005t5`5y0'0i0r0,0C115H2.5;500E4P5S2`5P6m0h0,63655/6k5{2h1i0,4+6b5=364^4`4|6j4H6c0E4/0F5%5v6z5z00285B672h5!6X6T0S596x6L6F6N0,536E6s5A270w5D5G5.6K3f6S510,5$5I0K5w6l5d6d0,0b1Q1s6r720E6B002_6&3f71566U1p5U5W6@4o6M6Z5I6_3j6.1s6:5E6?6!6`005s6Q707g3K6u642b7e2J7E3)5@5_6y6M6t004R277y6)4:7V7R5T6;5F7m4M795r7C707r6o0J4S6,797R6v7I783i7N7O327L4@005k5m7%7r4/6a2.6~7D887+0,2D0q0o0G127/7h2D4z0h1p0G0o2w4'4)0t6D2:7o0,4;7q7Q5)8j5,5F7V5f8h7F7S580@7J7&5q6*7@8H804%828v7A7)5&6M6o0x0X8T6(848W898Y5A6q8G61060f0J2v8g7P6(7b8t7{7r7R4_4{4}8y8%0,0d7Y7G6w8E0,0k8547889d8X6(7,7.8?6-005*8C5.980094919k8.8:8_6^8U0k8P7M0b6C0a9A3:6e6g6i9p9b4g9e9N9f9k6V7U9s7'8w95009u8;9p6+9j7:7t5C7w5G9p6|869O9O8{8A2E9n8L83939W9Y9w7n92009z8,3:7N9F5R7=666}7*8)008c8e8=8`8U0da086134K4r4p2,134t130q4var1=ar0n1#am054t0.aA4DaC0S0U0W0a00
Exercice 14 : recherche d'un chemin (parcours en profondeur récursif)
Compléter le code de la fonction récursive trouve_chemin_rec
qui prend en paramètres un dictionnaire de listes de voisins graphe
et deux sommets depart
et arrivee
, et qui renvoie la liste des sommets formant un chemin allant de depart
à arrivee
. S'il n'y a pas de chemin, la fonction renvoie une liste vide.
Il y a paramètre supplémentaire qui s'appelle chemin
et qui vaut None
par défaut. Ce paramètre est utilisé pour les appels récursifs. Il sert à mémoriser le chemin parcouru jusqu'ici.
On fera un parcours en profondeur en utilisant la récursivité.
Selon les graphes, la solution n'est pas forcément unique. La solution que vous trouverez ne sera pas forcément la même que dans les exemples. La solution n'est pas forcément de longueur minimale.
Exemples >>> trouve_chemin_rec ( graphe2_dico , 0 , 5 )
[0, 1, 3, 4, 7, 5]
>>> trouve_chemin_rec ( graphe2_dico , 6 , 9 )
[6, 5, 0, 1, 3, 2, 8, 9]
>>> trouve_chemin_rec ( graphe1_dico , 0 , 2 )
[0, 1, 2]
>>> trouve_chemin_rec ( graphe1_dico , 0 , 3 )
[]
Explications de l'algorithme
Si chemin
est None
, on l'initialise avec la liste vide.
On rajoute depart
à chemin
.
On regarde si on est arrivé.
Sinon on parcourt tous les voisins de depart
.
Pour chaque voisin de depart
, on regarde s'il permet d'aller à arrivee
.
Si c'est le cas, on a notre réponse.
Si on n'a rien trouvé, on retire depart
de la liste et on renvoie une liste vide.
Version vide Version à compléter
.128013S/k5=ir[)b(gen&ou:0y.wsh_6pcfv1]92;34dNt7"
8P ,mal010E0f0G0P080Q0p0M0u0Q0P0p0p070I0G080t0I000J010p0j0O0O0P090m00030i0Q0j0)0i0g01040:0=0@0_0.0E080w0M0?09050E0i0o0g0'0x0I0M0p0G0m0Q0f0'1e0e080g0k0x0n0H0f0O0M0x1D1n0-0R1b0Z0#0%0'0q080e0q0Q1R0q0G0,010U0c1s1M0$0&0I1Q1S1U1S0G1!1s1Y0G09001Z0q0Z0|0p0t0P1k0I0A1n0!1&0'0v0W0f0g0P0O0f1Y1{1}1%1O0I261s292b0,020M0L090i0t0i0p08100g0M0S1_09090f0u2x132e0g1?040G0q2K1;1?2P1Z0E2g1'1U0g282u1Y1a1c232h2W2Y2#1Y0t2D1?2I2K2.0/1|2y2%1'0g0i090?0Q0,1F2H2=1J2I2U0'2_2{0P2}000M0A311}332=350I372|2~0C3e2J0.342@362`3l3b0D3o3g2f3s3j3u392~063y3q3h3B3k3E3b0s3H2;3A1N2^3D3a0M0H3P3r3S3t383V0K3Y3J3!3C3$2~0z3'3R243*3v0x0l3.2?3)3L3a0x0x3^3i3{0,0x3d14323I3/2h42000x3n463f132+0f2K2#2O0E2Q2T3B0u0i0S2!1b1?4i2-323y014r0S4y491'050,0S0v3y0M3Q3_3:0g0v0,1;0i0j0w0f0r0u0q1D1x0r2D0u4A3Z3:0+000d4(3(4P0,0e090P0t4!4.4F0'4+0N4L4N414I0f1|090G4`4O2h4}504)4a0,0@091b0f0f583i5b4f2J4M5d2^0,4Z4#125o4E591'0i0,075l3B050u0,0F115k5x513B4+0b0k3H0M5T5q4/2h4H00084K5x5V4{3j5t4!0O1x5c5W5A0o0,080p5,5&5G5I5K5E3)4+5R5x0J5U625%5z365(5v5?650I5B005D5$5N5|0,0a0y5S5U6g4:005u5*5w2:5r0'6c0n5{6o4@0t280E6y5a0,4-5M6u5'000S55576I5-4|0,0b6l5T6n5X5:5#2.64526L540@6O6!6W5A5C6e6)6J0g5f2C5i5L6t6Q0I5}6U636*0'5Y2D0G0j096s326#3K676r6|6~0I5Y0v2`696$0w0i5;5+6f6J1i5:763f783`4;4?4^6@4z6J4+0a6E5s6%6N7E6R000y5~2.61636V6J5Y5!7i79007k7m7s5p7d7q002_6(777#5/5Z7Z3b7d6:6p5)7n6^5&6{607P7P7.7a1x456.6_6c6-7(6/4S2r4V4X6q4$4&7I6`6G8e7/4=4@4_6P7@0,4~7o6_7/7X2v7,7d5n815&7/5g6?8e8x858r7}8v7B6S6|7`7u3:7S6Z8F8z0c0,2k8D8g8m6a7/8b0g807A6_5P7U3)6c0h0e0G0B8)3:5*0,3@8Y5m0,7M478M8M7d710T747,8N5e7:5v8%3f7O7Q8G977b8^3B6w8h0,2t0t8W4,6T7_6m7R0,72938:6F006j3P044C4j4h2,134l130G4n9I1=9I0P1#9D044l0.9R4v9T0S0U0W0p00
.128013ac2mo1Sd&0ny9.3P[(r=;8]N:ht,swk)7
_ pgef"u/v54bli6010a0F0t030P0O0v0C040O030v0v0m0H0t0P0D0H000A010v0I0606030l0e0009070O0I0)070d010J0:0=0@0_0.0a0P0K0C0?0l0x0a070w0d0'080H0C0v0t0e0O0F0'1e0E0P0d0r080g0z0F060C081D1n0-0R1b0Z0#0%0'0s0P0E0s0O1R0s0t0,010U0N1s1M0$0&0H1Q1S1U1S0t1!1s1Y0t0l001Z0s0Z0|0v0D031k0H051n0!1&0'0G0W0F0d03060F1Y1{1}1%1O0H261s292b0,020C0i0l070D070v0P100d0C0S1_0l0l0F042x132e0d1?0J0t0s2K1;1?2P1Z0a2g1'1U0d282u1Y1a1c232h2W2Y2#1Y0D2D1?2I2K2.0/1|2y2%1'0d070l0?0O0,1F2H2=1J2I2U0'2_2{032}000C05311}332=350H372|2~0h3e2J0.342@362`3l3b0M3o3g2f3s3j3u392~0L3y3q3h3B3k3E3b0Q3H2;3A1N2^3D3a0C0z3P3r3S3t383V0o3Y3J3!3C3$2~0f3'3R243*3v080c3.2?3)3L3a08083^3i3{0,083d14323I3/2h4200083n463f132+0F2K2#2O0a2Q2T3B04070S2!1b1?4i2-323y014r0S4y491'0x0,0S0G3y0C3Q3_3:0d0G0,1;070I0K0F0B040s1D1x0B2D044A3Z3:0+000k4(3(4P0,0E0l030D4!4.4F0'4+0u4L4N414I0F1|0l0t4`4O2h4}504)4a0,0@0l1b0F0F583i5b4f2J4M5d2^0,4Z4#125o4E591'070,0m5l3B0x040,0q115k5x513B4+0y0r3H0C5T5q4/2h4H000P4K5x5V4{3j5t4!061x5c5W5A0w0,0P0v5,5&5G5I5K5E3)4+5R5x0A5U625%5z365(5v5?650H5B005D5$5N5|0,0j0p5S5U6g4:005u5*5w2:5r0'6c0g5{6o4@0D280a6y5a0,4-5M6u5'000S55576I5-4|0,0y6l5T6n5X5:5#2.64526L540@6O6!6W5A5C6e6)6J0d5f2C5i5L6t6Q0H5}6U636*0'5Y2D0t0I0l6s326#3K676r6|6~0H5Y0G2`696$0K075;5+6f6J1i5:763f783`4;4?4^6@4z6J4+0j6E5s6%6N7E6R000p5~2.61636V6J5Y5!7i79007k7m7s5p7d7q002_6(777#5/5Z7Z3b7d6:6p5)7n6^5&6{607P7P7.7a1x456.6_6c6-7(6/4S2r4V4X6q4$4&7I6`6G8e7/4=4@4_6P7@0,4~7o6_7/7X2v7,7d5n815&7/5g6?8e8x858r7}8v7B6S6|7`7u3:7S6Z8F8z0N0,2k8D8g8m6a7/8b0d807A6_5P7U3)6c0b0E0t0n8)3:5*0,3@8Y5m0,7M478M8M7d710T747,8N5e7:5v8%3f7O7Q8G977b8^3B6w8h0,2t0D8W4,6T7_6m7R0,72938:6F006j3P0J4C4j4h2,134l130t4n9I1=9I031#9D0J4l0.9R4v9T0S0U0W0v00
Exercice 15 : recherche d'un chemin optimal (parcours en profondeur récursif)
Compléter le code de la fonction récursive trouve_chemin_opti_rec
qui prend en paramètres un dictionnaire de listes de voisins graphe
et deux sommets depart
et arrivee
, et qui renvoie la liste des sommets formant un chemin de longueur minimale allant de depart
à arrivee
. S'il n'y a pas de chemin, la fonction renvoie une liste vide.
Il y a paramètre supplémentaire qui s'appelle chemin
et qui vaut None
par défaut. Ce paramètre est utilisé pour les appels récursifs. Il sert à mémoriser le chemin parcouru jusqu'ici.
On fera un parcours en profondeur en utilisant la récursivité.
Selon les graphes, la solution n'est pas forcément unique. Par contre, il faut qu'elle soit optimale, c'est-à-dire la plus petite possible.
Exemples >>> trouve_chemin_rec ( graphe2_dico , 0 , 5 )
[0, 1, 3, 4, 7, 5]
>>> trouve_chemin_rec ( graphe2_dico , 6 , 9 )
[6, 5, 0, 1, 3, 2, 8, 9]
>>> trouve_chemin_rec ( graphe1_dico , 0 , 2 )
[0, 1, 2]
>>> trouve_chemin_rec ( graphe1_dico , 0 , 3 )
[]
Explications de l'algorithme
On fait à peu près la même chose que dans l'exercice précédent sauf qu'au lieu de renvoyer le premier chemin trouvé, on les teste tous pour trouver le plus court.
Par contre, on ajoute les sommets à chemin
dans la boucle pour pouvoir les retirer avant de faire un return
.
Version vide Version à compléter
.128013.(k7,]hv[9Ptds/Sw
op_lf+2a"8:u&;i 0rye3)mnNg4cb=165010f0E0e0s0z0o0g0A0M0o0s0g0g0O0t0e0z0m0t000k010g0w0H0H0s0C0D000i0l0o0w0*0l0I010h0;0?0^0`0/0f0z0a0A0@0C050f0l0j0I0(0P0t0A0g0e0D0o0E0(1f0K0z0I0v0P03060E0H0A0P1E1o0.0S1c0!0$0&0(090z0K090o1S090e0-010V0N1t1N0%0'0t1R1T1V1T0e1#1t1Z0e0C001!090!0}0g0m0s1l0t0r1o0#1'0(0p0X0E0I0s0H0E1Z1|1~1&1P0t271t2a2c0-020A0d0C0l0m0l0g0z110I0A0T1`0C0C0E0M2y142f0I1@0h0e092L1=1@2Q1!0f2h1(1V0I292v1Z1b1d242i2X2Z2$1Z0m2E1@2J2L2/0:1}2z2&1(0I0l0C0@0o0-1G2I2?1K2J2V0(2`2|0s2~000A0r321~342?360t382}300F3f2K0/352^372{3m3c0L3p3h2g3t3k3v3a300R3z3r3i3C3l3F3c0Q3I2=3B1O2_3E3b0A063Q3s3T3u393W0u3Z3K3#3D3%300c3(3S253+3w0P0B3/2@3*3M3b0P0P3_3j3|0-0P3e15333J3:2i43000P3o473g493`3;4c0P3y4g3q3R4j4b3V443H4o3A4r3U3,4d3P4w142,0E2L2$2P0f2R2U3C0M0l0T2#1c1@4F2.333z014O0T4V4a1(050-0T0p3z0A4q420p0-1=0l0w0a0E0n0M091E1y0n2t0*0n2E0M4X3!3;0,0004543)4k0-0K0C0s0m4`5a4$0(57074*4,3L4'0E1}0C0e5j4y5l0-5n4w4+554b0-0^0C1c0E0E5w3j5m5o5D2_0-4_4{134D5P0(0l0-0O5L3C050M0-0J125K5V5b2i570G0v3I0A5=5C5,4%0-0z4)5B5p3{5R4`0H1y5O5^5X0j5`0g655k0t5%5'5)5#3*575:4w0k5?6n5@6c0I615T6b5x0t5Y005!5}5W0t570b6h5c000T5t5v5+6c57085;5?5~3;4&005{6u425r6J6W3C6x0O6z2/6p6v6r005G5I5*2;6B6j6P6o6(3j6T2E0e0w0C5U6'6R5E005S636~486n715Q73624|750z6!3*6$7g560-0b6O6l786B6*0o120K0w0E6|0n7e7j2i7i6A663k0N0-2l6F5-0-596L6)5d5f5h6.4W6:0-0G7J1(6x0q7X1v0z446=6@5$0-0p2{7A7a0a0l0z2w763g7(7h686U7?2K7^6G5e5g5i7N5M7l7#3k6Y0^6K6/7E6N6k2/6m6?7~2i6T6V7D6q0-7/7;648n6v1j0-2`8b338j7Y7`8s707q6s75876;7o8i7p7E6*748D7T7E6x03876*5g0m290f8I7L8V8p7:7=8#007W8K8L5=79378G1y468E8S5Z7-8:004:4=4@8P0I4}0m50528)7M8c8o00817R8)5A8@9a8q8(843C5N8t6X6+2D6-9e8`887b6t9k6i7V7'8L8/6d5`5|9g6)7G007I9x7k588%9v758?8R6M9z9n6#0-0x0K0e0y9t630-3^9V7_5F0I8!9(4k9I9K996v57989S7O9P8=8)8+9G3j6x0x0o9!9t7r7t7v7x7z9L7K008f778-6?9Ca60I7u7w0C7y1y7f9-7B8_ar2_9/29979O919R3g9C5.9Aag8A8{91ao0Iaq9~9W6ya59/7;8yaC7U9Nab7aaA9|aFah8F9`7|4#8u0-8UaX8{2u0m979}af8.6B6_0U6|a'aH9uaJaa8g144Z4G4E2-144I140e4Kb91?b90s1$b40h4I0/bi4Sbk0T0V0X0g00
.128013n;8kpigy,1e/l5Nsfh23_P0d(7."aru]
S[=bv+:o)wm946t c&010q0d0O0v080f0i0P0Q0f0v0i0i0C0u0O08070u000z010i0x0K0K0v0w0a000A0H0f0x0*0H03010e0;0?0^0`0/0q080E0P0@0w060q0H0J030(0c0u0P0i0O0a0f0d0(1f0908030G0c0t0s0d0K0P0c1E1o0.0S1c0!0$0&0(0k08090k0f1S0k0O0-010V0D1t1N0%0'0u1R1T1V1T0O1#1t1Z0O0w001!0k0!0}0i070v1l0u0l1o0#1'0(0j0X0d030v0K0d1Z1|1~1&1P0u271t2a2c0-020P0o0w0H070H0i0811030P0T1`0w0w0d0Q2y142f031@0e0O0k2L1=1@2Q1!0q2h1(1V03292v1Z1b1d242i2X2Z2$1Z072E1@2J2L2/0:1}2z2&1(030H0w0@0f0-1G2I2?1K2J2V0(2`2|0v2~000P0l321~342?360u382}300m3f2K0/352^372{3m3c0M3p3h2g3t3k3v3a300g3z3r3i3C3l3F3c0N3I2=3B1O2_3E3b0P0s3Q3s3T3u393W053Z3K3#3D3%300L3(3S253+3w0c0p3/2@3*3M3b0c0c3_3j3|0-0c3e15333J3:2i43000c3o473g493`3;4c0c3y4g3q3R4j4b3V443H4o3A4r3U3,4d3P4w142,0d2L2$2P0q2R2U3C0Q0H0T2#1c1@4F2.333z014O0T4V4a1(060-0T0j3z0P4q420j0-1=0H0x0E0d0n0Q0k1E1y0n2t0*0n2E0Q4X3!3;0,000r543)4k0-090w0v074`5a4$0(570b4*4,3L4'0d1}0w0O5j4y5l0-5n4w4+554b0-0^0w1c0d0d5w3j5m5o5D2_0-4_4{134D5P0(0H0-0C5L3C060Q0-0h125K5V5b2i570I0G3I0P5=5C5,4%0-084)5B5p3{5R4`0K1y5O5^5X0J5`0i655k0u5%5'5)5#3*575:4w0z5?6n5@6c03615T6b5x0u5Y005!5}5W0u570B6h5c000T5t5v5+6c570y5;5?5~3;4&005{6u425r6J6W3C6x0C6z2/6p6v6r005G5I5*2;6B6j6P6o6(3j6T2E0O0x0w5U6'6R5E005S636~486n715Q73624|75086!3*6$7g560-0B6O6l786B6*0f12090x0d6|0n7e7j2i7i6A663k0D0-2l6F5-0-596L6)5d5f5h6.4W6:0-0I7J1(6x0F7X1v08446=6@5$0-0j2{7A7a0E0H082w763g7(7h686U7?2K7^6G5e5g5i7N5M7l7#3k6Y0^6K6/7E6N6k2/6m6?7~2i6T6V7D6q0-7/7;648n6v1j0-2`8b338j7Y7`8s707q6s75876;7o8i7p7E6*748D7T7E6x0t876*5g07290q8I7L8V8p7:7=8#007W8K8L5=79378G1y468E8S5Z7-8:004:4=4@8P034}0750528)7M8c8o00817R8)5A8@9a8q8(843C5N8t6X6+2D6-9e8`887b6t9k6i7V7'8L8/6d5`5|9g6)7G007I9x7k588%9v758?8R6M9z9n6#0-0R090O049t630-3^9V7_5F038!9(4k9I9K996v57989S7O9P8=8)8+9G3j6x0R0f9!9t7r7t7v7x7z9L7K008f778-6?9Ca6037u7w0w7y1y7f9-7B8_ar2_9/29979O919R3g9C5.9Aag8A8{91ao03aq9~9W6ya59/7;8yaC7U9Nab7aaA9|aFah8F9`7|4#8u0-8UaX8{2u07979}af8.6B6_0U6|a'aH9uaJaa8g144Z4G4E2-144I140O4Kb91?b90v1$b40e4I0/bi4Sbk0T0V0X0i00
# Tests
(insensible à la casse)(Ctrl+I)