moyen
Liste d'adjacence, matrice d'adjacence
Un graphe fini peut être représenté par une matrice d'adjacence ou par une liste d'adjacence .
Une matrice d'adjacence est une matrice \(n\) lignes, \(n\) colonnes, si le graphe contient \(n\) sommets.
Les sommets sont numérotés de \(0\) à \(n-1\) . À l'intersection de la ligne \(i\) et de la colonne \(j\) , on écrit un \(1\) si \(j\) est un successeur de \(i\) et un \(0\) sinon.
Une liste d'adjacence est constituée de listes regroupées dans un tableau ou un dictionnaire.
Chacune des listes contient les successeurs (ou les prédécesseurs) d'un sommet.
Un exemple de graphe
La matrice d'adjacence est :
\[
\left(
\begin{array}{cccccc}
0 & 1 & 1 & 0 & 0 & 0 \\
1 & 0 & 1 & 1 & 0 & 0 \\
1 & 1 & 0 & 1 & 0 & 0 \\
0 & 1 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 1 \\
0 & 0 & 0 & 0 & 1 & 0 \\
\end{array}
\right)
\]
Cette matrice est implémentée par la liste de listes :
[[ 0 , 1 , 1 , 0 , 0 , 0 ], [ 1 , 0 , 1 , 1 , 0 , 0 ], [ 1 , 1 , 0 , 1 , 0 , 0 ], [ 0 , 1 , 1 , 0 , 0 , 0 ], [ 0 , 0 , 0 , 0 , 0 , 1 ], [ 0 , 0 , 0 , 0 , 1 , 0 ]]
Liste d'adjacence sous forme de dictionnaire :
les clés du dictionnaire sont les numéros des sommets. Pour chaque clé, la valeur associée est la liste des successeurs du sommet représenté par la clé.
{ 0 : [ 1 , 2 ], 1 : [ 0 , 2 , 3 ], 2 : [ 0 , 1 , 3 ], 3 : [ 1 , 2 ], 4 : [ 5 ], 5 : [ 4 ]}
Liste d'adjacence sous forme de liste :
les indices de la liste sont les numéros des sommets. Pour chaque indice, la valeur associée est la liste des successeurs du sommet représenté par l'indice.
[[ 1 , 2 ], [ 0 , 2 , 3 ], [ 0 , 1 , 3 ], [ 1 , 2 ], [ 5 ], [ 4 ]]
I) Passage matrice vers dictionnaire
Compléter la fonction matrice_vers_dict
qui prend en paramètre une matrice d'adjacence et renvoie une liste d'adjacence sous forme de dictionnaire.
Exemples
🐍 Console Python >>> m = [[ 0 , 1 , 1 , 0 ], [ 1 , 0 , 1 , 1 ], [ 1 , 1 , 0 , 1 ], [ 0 , 1 , 1 , 0 ]]
>>> matrice_vers_dict ( m )
{0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 3], 3: [1, 2]}
Version vide Version à trous
.1280132mhS)cleP=O3tf.nqp_:aRvgby;s56ojr 1(]k}8[{é4iwu7d/050X0i0n0v0T0h0C0I0g0h0v0C0C0k010n0T0s010406050C0V0c0c0v0H0A040e0F0h0V0?0F0q0I020v0c0s0B0I0w0i100H0r0V0i0C050Y0}0 11130{0s04051y1r1B0Y1y0{0X0T0x0+0-0/0;0d0T0y0d0h1P0d0n0_050$0z0h0i1K0.0:011O1Q1S1Q0n1Y1!1W0n0H1z0n0d0+160C0s0v0q0;0b011$1M010o0(0i0q1e0i1W1|1~231(261!290c2b040a0I0j0H0F0s0F0C0T191b0!1`0H0H0i0g2w1r2d0q1z0Y1^2I1=1@1?1X0X2f0;1S0q282t1W1H1J0,1%2S0T2U0q0F2Y1W0s2B1z2G2I2:0|1}1b2!242)0H100h0_0J2F2@0`2?2e2_1(2{2}0_0b311~332G2R01380v2~040m3c2H0{3f360;3i3k0S3n3e2@3g3t0_0D3w3p3y3r3h0F2|3j0_0E3D342^1L373I39040W3N3q3Q3s3S3K040O3w1C2.1r2Y2L0X1@2Q3G0g2*2l0Z1I1z2-0i2/323(3=0!3}353Y010M0_0!0o3(3X2#010U0_0I4a3F440q0o0_101=0T0g0i0t0x0i0H0C0t1H2D4h434c0^040K4A3P4c0q4m0v4o4q4G3g4D0f0u3D0I4U4g4b2`473w4W4i4c0F0_0k4!3O4P0_0Q0N4T4V4,3G46040o3I4+4X370_0T4|4$240F4e042%514B2`0z0_0H1~0y0i4O3G4D4F1s3~4}3s5b042i5h445j5s4I4K4M5g5l3d4?5t0_0f4R4;4V4=5n3h4Z5A2H5C4C0_0P5v4Y565T1(4D0L584H534)5!4-040P5Z5N0`5I5I5P244^4`0H5(3G4J040G5_44544 0q5~4I5p5d0q5f5W0;5u5-5;375p5r6c5K6b2=5K5{4n0H4p5z6k525X5R695L5V6h6s6a0_0L5F4S5-065/6H4#591(4^0T495-6J5#4~046n6p6v4D5S6y6K3s4 6W6B6Y6r6!6w5}6Z6R6A045,2:6Q3g4(040k4*6P6d0;0c0T2 6%046E2:6G6I786~6w0X736)5m6z6w506.5)6=7f6+6_0p6v5{0v0s0s287c7j5i0_5k6*6/6,730f5H6@4@5c0#0V0H626}6l5M761r403|3)7U0Y3,1r0n3.7Z2O2J0v1Z7W3,1x427C2B0c0t0o0v0M4r0d0m0_1j1l1n1p0I753~1E331y0l1b7u180I0v0V0/0T0I180(0T0C4u0I1!0*0X0R260q2v0T1a0*281`1f0H0R0d282u1a0I0!0*1S0C0n800#8G4p2w290T2B0C7p841G1I3g1*1R1T1V7.3g2h282a0_2n0e0g6o0s0n2o0A1^1a3(3{7.2;3~7T8(7I04486v554g7x4j4l6T4L6o4q4s4u4w4y0n737A7m7C6m7E823d774U7a4^2B0n7L7N6?7a4D0Q7q6$985Q7463246X9E040M9J6L0_5@9P6#9N9T0160569z327H4j655e6q9m5)9l5B6l6f289k9M0c7d9M7i7B7k5F9W6M6O9A7P6T9^9G5U9`9+7y6;7e9.7g5{9Oa56t6;9W6_6{9W7072ag6:7l3d9$4c5?4{7Oad9Fa17g9Y57ax6+0q9(679*ac6+6ja89%0_6g9{a99-5Oa29@ap014Q0f4:6F7S3?2I8|3+3_0{7X0#0%0)04.
.1280132mhS)cleP=O3tf.nqp_:aRvgby;s56ojr 1(]k}8[{é4iwu7d/050X0i0n0v0T0h0C0I0g0h0v0C0C0k010n0T0s010406050C0V0c0c0v0H0A040e0F0h0V0?0F0q0I020v0c0s0B0I0w0i100H0r0V0i0C050Y0}0 11130{0s04051y1r1B0Y1y0{0X0T0x0+0-0/0;0d0T0y0d0h1P0d0n0_050$0z0h0i1K0.0:011O1Q1S1Q0n1Y1!1W0n0H1z0n0d0+160C0s0v0q0;0b011$1M010o0(0i0q1e0i1W1|1~231(261!290c2b040a0I0j0H0F0s0F0C0T191b0!1`0H0H0i0g2w1r2d0q1z0Y1^2I1=1@1?1X0X2f0;1S0q282t1W1H1J0,1%2S0T2U0q0F2Y1W0s2B1z2G2I2:0|1}1b2!242)0H100h0_0J2F2@0`2?2e2_1(2{2}0_0b311~332G2R01380v2~040m3c2H0{3f360;3i3k0S3n3e2@3g3t0_0D3w3p3y3r3h0F2|3j0_0E3D342^1L373I39040W3N3q3Q3s3S3K040O3w1C2.1r2Y2L0X1@2Q3G0g2*2l0Z1I1z2-0i2/323(3=0!3}353Y010M0_0!0o3(3X2#010U0_0I4a3F440q0o0_101=0T0g0i0t0x0i0H0C0t1H2D4h434c0^040K4A3P4c0q4m0v4o4q4G3g4D0f0u3D0I4U4g4b2`473w4W4i4c0F0_0k4!3O4P0_0Q0N4T4V4,3G46040o3I4+4X370_0T4|4$240F4e042%514B2`0z0_0H1~0y0i4O3G4D4F1s3~4}3s5b042i5h445j5s4I4K4M5g5l3d4?5t0_0f4R4;4V4=5n3h4Z5A2H5C4C0_0P5v4Y565T1(4D0L584H534)5!4-040P5Z5N0`5I5I5P244^4`0H5(3G4J040G5_44544 0q5~4I5p5d0q5f5W0;5u5-5;375p5r6c5K6b2=5K5{4n0H4p5z6k525X5R695L5V6h6s6a0_0L5F4S5-065/6H4#591(4^0T495-6J5#4~046n6p6v4D5S6y6K3s4 6W6B6Y6r6!6w5}6Z6R6A045,2:6Q3g4(040k4*6P6d0;0c0T2 6%046E2:6G6I786~6w0X736)5m6z6w506.5)6=7f6+6_0p6v5{0v0s0s287c7j5i0_5k6*6/6,730f5H6@4@5c0#0V0H626}6l5M761r403|3)7U0Y3,1r0n3.7Z2O2J0v1Z7W3,1x427C2B0c0t0o0v0M4r0d0m0_1j1l1n1p0I753~1E331y0l1b7u180I0v0V0/0T0I180(0T0C4u0I1!0*0X0R260q2v0T1a0*281`1f0H0R0d282u1a0I0!0*1S0C0n800#8G4p2w290T2B0C7p841G1I3g1*1R1T1V7.3g2h282a0_2n0e0g6o0s0n2o0A1^1a3(3{7.2;3~7T8(7I04486v554g7x4j4l6T4L6o4q4s4u4w4y0n737A7m7C6m7E823d774U7a4^2B0n7L7N6?7a4D0Q7q6$985Q7463246X9E040M9J6L0_5@9P6#9N9T0160569z327H4j655e6q9m5)9l5B6l6f289k9M0c7d9M7i7B7k5F9W6M6O9A7P6T9^9G5U9`9+7y6;7e9.7g5{9Oa56t6;9W6_6{9W7072ag6:7l3d9$4c5?4{7Oad9Fa17g9Y57ax6+0q9(679*ac6+6ja89%0_6g9{a99-5Oa29@ap014Q0f4:6F7S3?2I8|3+3_0{7X0#0%0)04.
II) Passage matrice vers liste
En s'inspirant de la question précédente, compléter la fonction matrice_vers_liste
qui prend en paramètre une matrice d'adjacence et renvoie une liste d'adjacence sous forme de liste.
Exemples
🐍 Console Python >>> m = [[ 0 , 1 , 1 , 0 ], [ 1 , 0 , 1 , 1 ], [ 1 , 1 , 0 , 1 ], [ 0 , 1 , 1 , 0 ]]
>>> matrice_vers_liste ( m )
[[1, 2], [0, 2, 3], [0, 1, 3], [1, 2]]
.1280132mhS)cleP=O3tf.nqp_:aRvgby;s56ojr 1(]k8[é4iwu7d/050V0i0n0v0R0h0C0I0g0h0v0C0C0k010n0R0s010406050C0T0c0c0v0H0A040e0F0h0T0;0F0q0I020v0c0s0B0I0w0i0~0H0r0T0i0C050W0{0}0 110_0s04051w1p1z0W1w0_0V0R0x0)0+0-0/0d0R0y0d0h1N0d0n0@050!0z0h0i1I0,0.011M1O1Q1O0n1W1Y1U0n0H1x0n0d0)140C0s0v0q0/0b011!1K010o0$0i0q1c0i1U1`1|211$241Y270c29040a0I0j0H0F0s0F0C0R17190Y1^0H0H0i0g2u1p2b0q1x0W1?2G1:1=1;1V0V2d0/1Q0q262r1U1F1H0*1#2Q0R2S0q0F2W1U0s2z1x2E2G2.0`1{192Y222%0H0~0h0@0J2D2=0^2;2c2@1$2_2{0@0b2 1|312E2P01360v2|040m3a2F0_3d340/3g3i0Q3l3c2=3e3r0@0D3u3n3w3p3f0F2`3h0@0E3B322?1J353G37040U3L3o3O3q3Q3I040N3u1A2,1p2W2J0V1=2O3E0g2(2j0X1G1x2+0i2-303$3:0Y3{333W010M0@0Y0o3$3V2Z010S0@0I483D420q0o0@0~1:0R0g0i0t0x0i0H0C0t1Q0C0n0i4f414a0?040K4A3N4a0q4k0v4m4o4G3e4D0f0u3B0I4U4e492^0@4w4y3u4W4g4a0F0@0k4$3M4P0@0O0L4T4V4.3E44040o3G4-4X350@0R4~4(220F4c042#534B2^0z0@0H1|0y4z1q3|4 0/4D4F5j3b4^4h5d042g4O3E5n5w4h4K4M5i2:5l014Q4R4?4V4@5F4J5u0R4x5D5k541$4*040p5z4I0@0v0s0s260V5Y225n4;0f5J5K4%5b1$4`4|0H5a4H4Y040G5`3e56510q5 3E0q5t5f0q5h5*1$5y5p2F5r4I5t5v6e405{6c0@5o5E5T3q5B0H4n5R5q5F4D0O6b6s586B5G0@0L0f5I6k065:6M5;6m0/4`0R476k6O3x6t6v6E6z6E5N526k6g5+6G6A6(5M0@5~6-6r6F044=6U6)5U4+4,6_5F0c0R2}6Z0@4S6K6N776V654Z5P4#6;5=5m4:6#51736@6E5V5X7e6P3f5!5$5(7k6p5S7f7r5}7k5.765L6=4`2z0n0T0H636~6=5N4!6w3m1p3~3`3%7U0W3*1p0n3,7Z2M2H0v1X7W3*1v6l3e2z0c0t0o0v0M4p0d0m0@1h1j1l1n0I752:1C311w0l195%160I0v0T0-0R0I160$5P4s0I1Y0(0V0P240q2t0R180(261^1d0H0P0d262s180I0Y0(7P0C7o1D3?2X421(1P1R1T7.3E2f26280@2l0e0g6u0s0n2m0A1?183$3_6l2/3|7T8T424`466E574e7p3x4j044l6u4o4q4s4u7P7v7i907B82306L7E7y7G0Z7J7L2.79426z6,6q7y5N0M648@0@5^9u5Z049t7M7y61589k309m6h5e5g7Q8?4C6o6#6i26988}7a9a9U9n7h9X9z6%9q7q4D6H7C9l6`6Q516T9,6.9W9%4/049p7x7q6$7k0L9`6x7N0@9B9@5x6G9y556|a81$70729!6*7l9C7q5@4}ai6W6Dam3E9E59ap5s9K699M9-6?7wa19r9R9GaB9(9Paf509?9{9^6I6^2.0_0W8=7V2G7,3)0Z0#0%04.
III) Passage dictionnaire vers matrice
Compléter la fonction dict_vers_matrice
qui prend en paramètre une liste d'adjacence sous forme de dictionnaire et renvoie la matrice d'adjacence.
Exemples
🐍 Console Python >>> dico = { 0 : [ 1 , 2 ], 1 : [ 0 , 2 , 3 ], 2 : [ 0 , 1 , 3 ], 3 : [ 1 , 2 ]}
>>> dict_vers_matrice ( dico )
[[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]]
Aide
La deuxième ligne du corps de la fonction, matrice = ...
, sert à initialiser une matrice remplie de 0.
.1280132mhS)cleP=3tfnp_:avgbys560or 1(]k[*4iwu7d/050P0i0m0s0L0h0x0D0g0h0s0x0x0k010m0L0p010406050x0N0c0c0s0C0w040e0B0h0N0+0B0o050Q0=0@0_0{0:0p04051b141e0Q1b0:0P0L0t0Z0#0%0)0d0L0u0d0h1s0d0m0.050U0v0h0i1n0$0(011r1t1v1t0m1B1D1z0m0C1c0m0d0Z0~0x0p0s0o0)0b011F1p010n0W0i0o0s0c0i1z1Y1!1)1H1,1D1/1;0.0a0D0j0C0B0p0B0x0L110o0D0S1W0C0C0i0g29141@0o1c0Q1U2m1R1T1S1A0P1_0)1v0o1.261z1k1m0!1G2w0L2y0o0B2C1z0p2f1c2k2m2Q0;1Z2a2E1*2J0C0^0h0.0E2j2U0/2T1^2W1H2Y2!0.0b2(1!2*2k2v012/0s2#040l2?2l0:2_2-0)2|2~0K312^2U2`370.0y3a333c352{0B2Z2}0.0z3h2+2V1o2.3m2:040O3a1f2O142C2p0P1T2u3k0g2K1=1c3E1d3C2S152)053K0S2P3j3u0)0H0.0S0n3A343Z010M0.0D3)3Y2F2{0n3$0L2h0q0t0i0C0x0q0^1R3_0i3:2,3+0-040F453t3=0o3^2h0L121/0L2f4b2`480f0r3h0D4s3/3*4d0.133S2@4u3;1*0B0.0k3a4B464d0v0.1|4m3k484a4z2l3s3d4f294j4l4S3X4J1*4o4r4t4U3k4e04410C434H4+3+4E044G4!4I4c4%0.0I4O3+4-4y2Q4|2`4^0J4=4v4~04504!4?3=0c0L0.0A513=480G5a4C1H3#040n3m5q4$2.0.0L5x4}1H0B3-042H5C3d4L040C1!0u445f5b1H4Q5m2X4x5V5T0.0f5p4!064t563k5t5v0C5J4,0.0x0B0@0T5/4@5G5I4{5g5W041k4g4i0V4Z2S5S0)484q5%5)5)5~5s0.5-5_4w040=0g0g0i0%0i0N5.5}67015F5A542)5*524W4h0o4Y5Q665r684 5Y365;5?1;0m6L015o6a2Q5(6c6X6e6M4.0s426n6R485e6H5y6!5=5@6Q5R6I6S0.0G6+3T6u4-6l6n6p6r6)6^6i4D4F741H5i2$4)4s6Z015t2f0m6r6y4A7d4-4/4;5%143V0i2m2N7s3D1l3F2p2s2n0s1C7v0Q3E0:7F0T0V0X04.
IV) Passage liste vers matrice
En s'inspirant de la question précédente, compléter la fonction liste_vers_matrice
qui prend en paramètre une liste d'adjacence sous forme de liste et renvoie la matrice d'adjacence.
Exemples
🐍 Console Python >>> liste = [[ 1 , 2 ], [ 0 , 2 , 3 ], [ 0 , 1 , 3 ], [ 1 , 2 ]]
>>> liste_vers_matrice ( liste )
[[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]]
.1280132h)=3nqèAp:agysD0oBr k}*éwu7dmSclPOGtCf.,_ÀRvb;561(]+[{4iex/050D0*0L0m0)0H0p0v0G0H0m0p0p0e010L0)0k010406050p0B0E0E0m0u0o040F0s0H0B100s0g0v020m0E0k0V0v0S0*1a0u0h0B0*0p050,17191b1d150k04051I1B1L0,1I150D0)0T0^0`0|0~0c0)0n0c0H1Z0c0L13050:0U0H0*1U0{0}011Y1!1$1!0L1,1.1*0L0u1J0L0c0^1g0p0k0m0g0~0b011:1W010N0=0*0g1o0*1*26282d1=2g1.2j0E2l040a0v0I0u0s0k0s0p0)1j1l0.240u0u0*0G2G1B2n0g1J0,222S1 21201+0D2p0~1$0g2i2D1*1R1T0_1;2$0)2(0g0s2,1*0k2L1J2Q2S2}16271l2.2e2?0u1a0H130Y2P3114302o331=3537130b3b283d2Q2#013i0m38040f3m2R153p3g0~3s3u0(3x3o313q3D130W3G3z3I3B3r0s363t130X3N3e321V3h3S3j040C3G1M2{1B2,2V0D212!3Q0G2@2v0-1S1J2`0*2|3c3*3@0.3 3f3!0~0w130.0N3*3A46010A130v4c3P4e0g0N131$0p0L0*0Q0T0*0u0p0Q1a1 0)0G0*4j452/0112040Z4E3Z4G0g4o0)4q4D1C404d4G4I0d0l3N0v4#4i4V34130g3G4%4k4G0s130e4,3Y3J0U4o2i4L3q4I4K4T3n4@3Q4O044p4r4|3Q4X4!4$524l134z0u4B4S2}4-4F2e4:044=502R5l4M2e4I0$585e044+5r045t3q5o0y4?4(1=5w5y4G0E0)130r5M5v130!5I4.2e48040N3S5W5m3h130)5%5u1=0s4g042;5,4^130u280n5j4U5X5K134 2 5J3C4*5S5 040d5V5C064$5E3Q5Z5#0u5?53130p0s190/6j4e5/5*5B5k5d4N4_045_0g5{660~4~6D3r655C6w5T684Z6b6d6d6K1=6g5$5C6e5z170G4C0|0*0B6i6V6R0~6s5;6u3c6W4N4P4R6G5L6J636H046m6o0L6@5U6N2}6c6P756*6{5g5i70045x6_5~646|6n2u6 7e5(6E5U7d627f6{6Y6!0p6$6(7q7m4H5U6q4/4;7C2e5O395b4#775Z2L0L6%6.3n6:4)04794C3X0,423~3+7!0,3.1B0L3:7)2Y2T0m1-7$3.1H445-0~2L0E0Q0N0m0w4s0c0f131t1v1x1z0v72401O3d1I0q280@1.0^0{0v0D000B1l0n5_0k0c1/2L2`0z7v0g0L0z0v270u0v8n8k4B2G2j0)2L8k1k0L0v1.0@6}7j0@2(0v6m8y8B8j0g180z2A8z0p0P0v1k246o0g4C8Z8D8#0E8%0s4r8D8Q8W7i0/0@0m0T288O2I2C0B0T0s8K8E104p4v8P875#8:2G0@2I0H000*0+4v0G5i0O1M8c040I1b0v9p1u0k1.6N1P3`2-4e1@1#1%1)7@3q2r2i2k132x0F0G5h0k8O0I0o221k3*3}7@2~407Z9O6k040K7F5.7E6)6`4I0%6G0p2b04021x8`0V0ja00Ba29=7n04897R776^7y7^019}13a5a20tak0L0V7b0Pa8ah9~an0V0qav7b0!ar9^7rai9 a1aoamaGapaC7z4Iab5sad137p5}7zaEava4aJaqasaVaJ0May7lag4IaB6v6`a#a6aoaxaYa)4}5Ua,6/77a/a2a%a?a-7raNasaeaTaga}aHa(afa^04aAa!auaJa=a:aKb1aM13aO5DaQ7c9|bgbjaXbjaZaLb7btalbab6bc0!0x3N3O7z5Z4a6G5:4ia@534n5A184v8`5|519_606G540n7b4Y7J7S5)bS2u2A1Aby5F9@bla*130%bG6O5c6`547QaP6`5o5qb?3q7H045Rb{7K6`6T7xa{b}6l8 7kc43Q6,5=b:9/b$bP4eb3c96P77b~bTb.7baSbX7r548S6pcq4W7Bcn6rb=cecC6I7375cacN5Aasc2asb~cU130#asc63act7L5^0/7PcW4*cx2D7X9-7#2S7=1K040J1l0s0U102i8O8h1R2N0)1k8J8L059-0%010j010l0v0r8+010tde0v0Ydi0Mdl0bdi0qdl0fb`c=8b7?0R8=108D0D0B8Gd4d60;8L0.8U8$b.8k1/cE0L8*4i9-8@bUb/9-8+8-0u0z0G0B0k0i8L8}2?0E9l87dR914u0G88bO9G2,3q9K1_1(2_3,2 6Jc=cf7h6~b/cjcK5pb4b^b!13931.6%7bbob*7g0_bWc07rcced4Jef04eobxea6;04eh7wb%cU5:cmez7TdWcycG5n139ueMb+2F1ue9bD59600db`731Bdx9)3-3{157%0/0;0?04.
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)