Matrice d'adjacence

Soit \(n\) un entier strictement positif.

On rappelle que la matrice d'adjacence \(A\) associée à un graphe fini et simple dont les sommets sont numérotés de \(1\) à \(n\) est une matrice carrée à \(n\) lignes et \(n\) colonnes si \(n\) est le nombre de sommets du graphe. Pour tout couple \((i, j)\), le coefficient \(A_{i, j}\) vaut \(1\) si les sommets numéro \(i\) et numéro \(j\) sont adjacents et \(0\) sinon.

Un graphe et sa matrice d'adjacence

flowchart LR
    D((1)) --- G((4))
    D --- F((3))
    E --- H((5))
    D --- E((2))
    F --- G
    F --- H

\[\begin{pmatrix}0&1&1&1&0\\1&0&0&0&1\\1&0&0&1&1\\1&0&1&0&0\\0&1&1&0&0\end{pmatrix}\]

Cette matrice est représentée en Python par une liste contenant \(n\) listes de longueur \(n\), représentant les \(n\) lignes.

Question 1 : Produit de matrices

Le produit de deux matrices carrées \(A\) et \(B\) à \(n\) lignes et \(n\) colonnes est la matrice \(P=A\times B\) telle que pour tout couple \((i, j)\) :

\[p_{i, j} = \sum_{k=1}^n a_{i, k} b_{k, j}\]

Produit

Dans la figure ci-dessus on a donc :

\[p_{2, 3} = a_{2, 1} b_{1, 3} + a_{2, 2} b_{2, 3} + a_{2, 3} b_{3, 3}\]

Si les matrices \(A\) et \(B\) sont représentées respectivement par les listes a et b, alors la matrice \(P\) est représentée par la liste p telle que pour tout couple \((i, j)\) valide :

p[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j] + ... + a[i][n-1] * b[n-1][j]

Compléter le code de la fonction produit qui prend en paramètres deux matrices carrées et renvoie le produit de ces deux matrices.

Exemples
>>> a = [[0, 1], [1, 0]]
>>> b = [[1, 0], [0, 1]]
>>> produit(a, b)
[[0, 1], [1, 0]]
>>> produit(a, a) == b
[[1, 0], [0, 1]]

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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 : 5/5

.128013lS^]etd5f18umag,_/çR=in 6)yàûqPhc\[(bEsx.p;r4jC90"ov+w73k:é *2030b090a0i0q050H0$0B050i0H0H0p0S0a0q0K0S020s030H0g0h0h0i0M0v02060T050g0{0T0r0$000i0h0K0L0$0o09150M0y0g090H030m12141618100K02031D1w1G0m1D100b0q0U0:0=0@0_0A0q0j0A051U0A0a0~030+0F05091P0?0^0S1T1V1X1V0a1%1(1#0a0M1E0a0A0:1b0H0K0i0r0_0'0S1*1R0S0d0-090r1j091#2022271,2a1(2d0h2f02040$0z0M0T0K0T0H0q1e1g0)1~0M0M090B2A1w2h0r1E0m1|2M1_1{1`1$0b2j0_1X0r2c2x1#1M1O0;1+2W0q2Y0r0T2$1#0K2F1E2K2M2?11211g2'282,0M15050~0$0e2J2`0 2_2i2|1,2~30320'3522372K2V0S3c0i31020$0Y3g2L103j3a0_3m3o0$0N3s3i2`3k3y320c3C3u3E3w3l0T2 3n320t3J382{1Q3b3O3d3p0X3T3v3W3x3Y3Q3p0f3$3L3'3N3P3z0Q3-393/3G020e0R3C1H2;1w2$2P0b1{2U3M0B2-2p0(1N1E2:092=363~480)4g3^2(0S0Z0~0)0d3C0$3U3F0d0~2:2-0g2z3~3%4n0}020E4D3.4n0r0~0i4J4m284G0k4t4v3M4M020F4P3V4F0~0u0!3J0$4*4u4E2}0~0r4U4-1,0T0~0p4;4K2}0F0~2m4!3k4G4I1x4h4=3x4N503M4G0u4)4+4V3_4y4`4Q4?4^5i4#4R0~0D0D593/0h0q0~3}543h5f4$02085m3k4@020%5E4W4/5J3/4p020d3O5M4L0~0q5S280T0W5U4:5y2L4,4{3b4}020M220j095s5B532^563l5L5$4l5n1,5b5D5`0s4+5'5j0_5O5Q0M5W3b5U690_5Y5!6c3l5*5,0r5.5:5o4H6m6a025#5?5(0_5b4(6062625A28665R5`635|57020O6g6e022*6g0r6i5-5/5`6B5}0~5=556u5^6r6p6v4%6x2?616z6,6V6I0K0l0q0l6K6F6.0S5G4_6^5@5u5w5d6,6A5@6D686}6!4X0Z6L5Z6N6s366G3F6R6k6T6t640S526%6#7e5z5@6w71726-5@4X6:6=6@2?7g3M6{6P4y6;6?6L0~0V7H024O6U7t5p7p4X5V7R6!4G085r7X7m797p7Z7L5H7O4Z7$6H7n7T7.3F0~7a7=5a0~7!7U0~7C6Z7m7)6y7w5e7y5h7_3/4G7#7l7/7V7(7{8b808d7~8f5C7*6|7D6_7z7J7 3h6+4*6_5O2F0a0g0M7r5%8q876*1w4j4f3 8K0m421w0a448P2S2N0i1'8M421C5{3k2F0h0l0d0i0Z090l0A0Y0~1o1q1s1u0$6)4h1J371D0P0*0a1)8(0n1f0$2C4z0B0#0)0M2D2F201f2U0w0$0=940#2a0r2z0q93151|0#9q0q8=0$4z2w0H0#090J0$0G051(0$1u0a0$0a0T1d095Q0q0/480x8 0g0H1)2c0$2v0#5,2A0/0!0$0h0g050{0K1X099a0)0g0I9)0i1_0q0B8?0B160M9A0/2C1M2o0r2y936_162z0A9q090I0~0C0E0r0C5c6F0r0#9|0@2z1)0,a60q0$8=058=0/a90Mabadaf02ah0r070Yak4t9!9$9oa60J1H378N0*0,0.02.
Question 2 : Recherche d'un triangle

On considère un graphe, fini, simple et non orienté, la matrice d'adjacence associée \(A\) et la matrice \(A^2= A \times A\). Les deux propriétés suivantes sont équivalentes :

  • Il existe un couple \((i, j)\), avec \(i \neq j\), tel que les coefficients \(A_{i, j}\) et \(A^2_{i, j}\) sont non nuls ;

  • Le graphe possède un cycle de longueur \(3\), qu'on appelle un triangle.

Par exemple, les deux graphes ci-dessous possèdent un triangle.

flowchart LR
    A((1)) --- B((2))
    A --- C((3))
    B --- C

    D((1)) --- G((4))
    D --- F((3))
    E --- H((5))
    D --- E((2))
    F --- G
    F --- H

Par contre, ce graphe ne possède pas de triangle :

flowchart LR
    A((1)) --- B((2))

Écrire une fonction triangle qui prend en paramètre une matrice d'adjacence associée à un graphe et renvoie True si le graphe possède un triangle et False sinon.

Une version valide de la fonction produit demandée à la question précédente est déjà incluse dans cet éditeur. Vous pouvez l'utiliser sans l'importer.

Exemples
>>> a = [[0, 1, 1], [1, 0, 1], [1, 1, 0]]
>>> triangle(a)
True
>>> b = [
...    [0, 1, 1, 1, 0],
...    [1, 0, 0, 0, 1],
...    [1, 0, 0, 1, 1],
...    [1, 0, 1, 0, 0],
...    [0, 1, 1, 0, 0],
... ]
>>> triangle(b)
True
>>> c = [[0, 1], [1, 0]]
>>> triangle(c)
False

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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 : 5/5

.128013lS^]et-dA5f18umaèg,_F/R=in{ 6)yàûqPhcDL\[(bsx.p;r4j'C0"ovTw73Ok:é }2030c090a0k0t050M0+0F050k0M0M0s0X0a0t0P0X020w030M0i0j0j0k0R0z02060Y050i110Y0u0+000k0j0P0Q0+0r091b0R0C0i090M030q181a1c1e160P02031J1C1M0q1J160c0t0Z0_0{0}0 0E0t0m0E051!0E0a14030;0L05091V0|0~0X1Z1#1%1#0a1,1.1*0a0R1K0a0E0_1h0M0P0k0u0 0-0X1:1X0X0f0?090u1p091*26282d1=2g1.2j0j2l02040+0D0R0Y0P0Y0M0t1k1m0/240R0R090F2G1C2n0u1K0q222S1 21201+0c2p0 1%0u2i2D1*1S1U0`1;2$0t2'0u0Y2+1*0P2L1K2Q2S2|17271m2-2e2=0R1b05140g2P30152 2o321=3436140-3a283c2Q2#0X3h0k37020%3l2R163o3f0 3r3t0S3w3n303p3C140e3F3y3H3A3q0Y353s140x3M3d311W3g3R3i020$3W3z3Z3B3#3T020h3F1N2`1C2+2V0c212!3P0F2?2v0.1T1K2_092{3b3:3}0/453e3*0X0(140/0f3F0+3X3I0f141 0t280m1.3:3)2.0X13020K4t3O4c0u140k4A4b4v4x0y0)3M0+4N4j4u33140u4i4k3P0Y140s4U4Q3g0L142s4G3Y4I144z1D464#3B4E4)3p4J4M4O4V4C4E0o0F1c2L4!4B4v4X024Z4.3m4P534R022_2?0i2F4?3P4x4-2~4:3q4=582R4{4+020n524H5c4F5q4a4*2e4^5A0w4O5a5x1=4e020f3R5w5C3g140t5P3p0Y0#5S4T5A5I5Q3B4%020R4q095i4c5k5,4v4D025Z5m5b1=4J4L5F5H5H5s2e5L5N0R5U3P5;0T644c5W5Y685:5'5)0u0m5+5A5 5_4,5/5c5?4/5^0 5`4_5}5}6k0 5L0t4h5!6x5o025z5@5J6s140J6n5R025T6j5n4x086L6Q6r6E676V6I4w14086c2e55000m0a0Q6'1=0j0t140W6.0 6a6F0u0c6@6E0k4~506i6H5$6#026U733I5S6M6J026T7b6X7f6S6}6)6+6-6C5n6:6=7h145{2|5G6v7w4N6D5L2L0a0i0R6p597z0F140!0R1z6u5#3p7A0:7D7F2R7O3P0(7I020p3s0M723b160q48443;7+0q3@1C0a3_7:2Y2T0k1-7-3@1I5B3p2L0j0o0f0k0(090o0E0%141u1w1y1A0+7t461P3c1J0'1m0j1l1 1/8d0+0c280^0F1/4 0^2I2g0m7D090n0+1.24090f2g0F0t2i0a7V4c1c2F0E1b0a090N140I0K6 0v0t0n0T0,0I0y4i2I0{8Q4v8S228V8X8Z0K0(8+3F0b0t0l2u0+0P5g0}288w8s1/8/8V0R0t970c0U0k0c0T0k8w0u971A8P0*0m3s0+0k0i0+2=0j0L2L980_0E1v2:8z991l8C097D8:2e8=8U0k8W8Y028!8{8,5!2L1%288P1.0^0M0Y1a0:9G9w190*2A0^6D9O8@9S8!0t8|5!0:9M1=9=9Q8^9T0K0T9`2|0O1N8j020H8e0/0i0N922A2_0t0*0a0*0^0*1y1T3s8O8e8Malac8u8G0U0*2=9m0*0+9'0u8P0c1l0F9t0i0}0t0+ao5g0ZaraG8e0A8G0kag2B9cakaD18aqaU8fa87}0?0+8X0t0M8W0+0i1m2:1S979;9c8?a09@0K9_9W2|0+8W050+8r8H3}8J8L8NaG8s4p0m1l9sa|8T9?8_0d070%0o8%8F0t8*b33b9w0U9o920|9,058Fbla~9Rbobqa5by0cam1!2jbf9a9Q9ca{5n9 bJa20d0+0I112u0^b#b%0tb(0+0dbM3ma78i7}0V0:a=5eaia$bzbB270^1j0?a:0*1/9daO4 0Ra.058H0u0*8waNa=ba3s0F0ib72Iadaf5e0c5g0a9+9b9dac8o8G8x0Y0B8PbBb,2C0R0;aGb=1Q1L020G1/1b0u8 9A0maA9.ar8F0M0Ua-a/a;1/a@0+a_cx9}0 bYa19^b:7Ub6b81zcA8I8Kc78Obg0kbi2jb7bH9PbZ8!bp0ubs8'c*bw4i0ubAa;bC0^0ucm8F1l929K8P0kc|3509ca1yc#b7c%a=c)0F0z0`1/8.9I1z9Ld4bna20uc=02cL3c7.0:0=0@02.