<?xml version="1.0" encoding="UTF-8"?>

<upm-export>
	<title>Enseignement de l&#039;informatique et du numérique au lycée Boissy d&#039;Anglas</title>
	<link>https://icn-isn-boissy.yj.fr/wp</link>
	<description></description>
	<pubDate>Sat May 16 7:58:08 2026 / +0000  GMT</pubDate>
	<generator>Universal Post Manager 1.1.2 [ www.ProfProjects.com ] </generator>
	<language></language>
	
			<item>
			<title>Structures de données : les graphes</title>
			<link>https://icn-isn-boissy.yj.fr/wp/?p=4308</link>
			<pubDate>Sat May 16 7:58:08 2026 / +0000  GMT</pubDate>
			<guid isPermaLink="false">https://icn-isn-boissy.yj.fr/wp/?p=4308</guid>
			<content-encoded><![CDATA[<!-- wp:paragraph -->
<p>copie de l'article :</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://info-mounier.fr/terminale_nsi/structures_donnees/graphes">https://info-mounier.fr/terminale_nsi/structures_donnees/graphes</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>merci</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Table des matières</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul id="tocList" class="wp-block-list"><!-- wp:list-item -->
<li>Introduction</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Définitions et vocabulaire<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Vocabulaire des graphes <em>non orientés</em></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Vocabulaire des graphes <em>orientés</em></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Graphes valués</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list --></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Représentations d'un graphe<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Représentation par matrice d'adjacence</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Représentation par listes des successeurs</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Efficacité des représentations</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list --></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Implémentations<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Par une matrice d'adjacence</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Par une liste de successeurs</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Passage d'une représentation à l'autre</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list --></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Bilan</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading" id="introduction">Introduction</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Les graphes sont une structure de données très riche permettant de modéliser des situations variées de relations entre un ensemble d'entités :</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>entre les ordinateurs du réseau internet ;</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p><img alt="réseau Internet" src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/internet.svg" width="400"></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><em>Source : <a href="https://fr.wikipedia.org/wiki/Internet#/media/Fichier:Internet-transit.svg" target="_blank" rel="noreferrer noopener">Wikipedia</a>, Mro, licence CC BY-SA 3.0</em></p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>entre des personnes sur un réseau social ;</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p><img alt="réseau Internet" src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/rs.svg" width="400"></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><em>Source : <a href="https://pixabay.com/fr/vectors/connexions-communications-social-2099068/" target="_blank" rel="noreferrer noopener">Pixabay</a></em></p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>entre les villes dans un réseau routier ou de distribution ;</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p><img alt="réseau Internet" src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/dijkstra.svg" width="400"></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><em>Source : <a href="https://fr.wikipedia.org/wiki/Algorithme_de_Dijkstra#/media/Fichier:DijkstraBis01.svg" target="_blank" rel="noreferrer noopener">Wikipedia</a>, HB, licence CC BY-SA 3.0</em></p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>entre les atomes d'une molécule ;</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p><img alt="réseau Internet" src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/molecule.svg" width="400"></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><em>Source : <a href="https://fr.wikipedia.org/wiki/Mol%C3%A9cule#/media/Fichier:Sucrose_molecule.svg" target="_blank" rel="noreferrer noopener">Wikipedia</a>, William Crochot, licence CC BY-SA 4.0</em></p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>entre les ressources du Web (les relations sont les liens hypertextes) ;</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>entre deux situations dans un jeu ;</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>etc.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Les relations peuvent être orientées ou non.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading" id="définitions-et-vocabulaire">Définitions et vocabulaire</h1>
<!-- /wp:heading -->

<!-- wp:paragraph {"gradient":"very-light-gray-to-cyan-bluish-gray"} -->
<p class="has-very-light-gray-to-cyan-bluish-gray-gradient-background has-background">Un graphe est constitué d'un ensemble de <strong>sommets</strong> et dans le cas orienté d'un ensemble d'<strong>arcs</strong> reliant chacun un sommet à un autre, dans le cas non orienté d'un ensemble d'<strong>arêtes</strong> entre deux sommets.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Mathématiquement, un graphe G est donc un couple formé de deux ensembles : X = { x 1 , x 2 , … , x n }</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p> dont les éléments sont appelés les sommets et un ensemble A = { a 1 , a 2 , … , a m } dont les éléments sont appelés les arêtes dans le cas non orienté ou les arcs dans le cas orienté. Une arête (ou un arc) a i</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>est un couple de deux sommets, par exemple : a i = ( x 2 , x 5 )</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>symbolise le lien (arête ou arc) entre les sommets x 2 et x 5</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p> . On peut noter G = ( X , A )</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="vocabulaire-des-graphes-<em&gt;non-orientés</em&gt;">Vocabulaire des graphes <em>non orientés</em></h2>
<!-- /wp:heading -->

<!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group"><!-- wp:paragraph {"gradient":"very-light-gray-to-cyan-bluish-gray"} -->
<p class="has-very-light-gray-to-cyan-bluish-gray-gradient-background has-background">Dans le cas des graphes non orientés, les relations entre deux sommets se font dans les deux sens. On appelle ses relations des <strong>arêtes</strong> (<em>edges</em> en anglais), et on a les définitions suivantes.</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li><strong>Sommets adjacents</strong> : deux sommets sont adjacents s'ils sont reliés entre eux par une arête. On dit que l'arête est incidente aux deux sommets.</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><strong>Voisins d'un sommet</strong> x : ce sont tous les sommets reliés à x par une arête . </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><strong>Degré d'un sommet</strong> x : nombre d'arêtes incidentes au sommet , on le note d ( x ). </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><strong>Chaîne</strong> : séquence ordonnée d'arêtes telle que chaque arête a une extrémité en commun avec l'arête suivante. </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><strong>Cycle</strong> : dans un graphe non orienté, un cycle est une suite d'arêtes consécutives (chaîne) dont les deux sommets extrémités sont identiques. </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><strong>Boucle</strong> : il peut exister des arêtes entre un sommet x et lui-même. Elles sont appelés <em>boucles</em>.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list --></div>
<!-- /wp:group -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Exemple</h3>
<!-- /wp:heading -->

<!-- wp:image -->
<figure class="wp-block-image"><img src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/graphe_non_oriente.png" alt="graphe non orienté"/></figure>
<!-- /wp:image -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Ce graphe <em>non orienté</em> est donné par :<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>un ensemble de sommets : { A , B , C , D , E , F , G }</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>un ensemble d'arêtes : { ( A , B ) , ( A , F ) , ( A , G ) , ( B , C ) , ( B , F ) , … }</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list --></li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Les sommets A et B sont adjacents mais B et D ne le sont pas. </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Les voisins du sommet A sont B, F et G . </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Le degré du sommet A est égal à 3 (d ( A ) = 3). </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>A , B , C , D est une chaîne,  A , B , F aussi. </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>A , F , G , A est un cycle. </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Il y a une boucle ( E , E ) . Le degré de E est égal à 4.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="vocabulaire-des-graphes-<em&gt;orientés</em&gt;">Vocabulaire des graphes <em>orientés</em></h2>
<!-- /wp:heading -->

<!-- wp:paragraph {"gradient":"very-light-gray-to-cyan-bluish-gray"} -->
<p class="has-very-light-gray-to-cyan-bluish-gray-gradient-background has-background">Dans le cas des graphes orientés, les arêtes ont un sens et elles sont appelées <strong>arcs</strong>. Par exemple, l'arête a = ( x , y ) indique qu'il y a un arc d'origine x et d'extrémité finale y. De plus, on a les définitions suivantes.</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li><strong>Successeurs et prédécesseurs d'un sommet</strong> x : dans un graphe orienté on ne parle plus de <em>voisins</em> d'un sommet mais de ses successeurs et de ses prédécesseurs : le successeurs de x  sont tous les sommets tels qu'il existe un arc ( x , y ) (de x vers y ) et les prédécesseurs de x sont tous les sommets w tels qu'il existe un arc ( w , x ) (de w vers x). </li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li><strong>Chemin</strong> : séquence ordonnée d'arcs consécutifs (on parlait de <em>chaîne</em> dans un graphe non orienté). </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><strong>Circuit</strong> : dans un graphe orienté, un circuit est une suite d'arcs consécutifs (chemin) dont les deux sommets extrémités sont identiques. </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><strong>Degré d'un sommet</strong> x : cette notion existe aussi dans le cas des graphes orientés. On distingue le degré entrant d'un sommet x (noté d − ( x )= nombre de prédécesseurs de x ) et le degré sortant d'un sommet x (noté d + ( x ) = nombre de successeurs de x ). Le degré d'un sommet x vaut d ( x ) = d + ( x ) + d − ( x )</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li><strong>Boucle</strong> : ce sont les arcs entre un sommet et lui-même.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Exemple</h3>
<!-- /wp:heading -->

<!-- wp:image -->
<figure class="wp-block-image"><img src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/graphe_oriente.png" alt="graphe non orienté"/></figure>
<!-- /wp:image -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Ce graphe <em>orienté</em> est donné par :<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>un ensemble de sommets : { A , B , C , D , E , F , G }, </li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>un ensemble d'arcs : { ( A , B ) , ( A , F ) , ( B , C ) , ( C , F ) , ( C , D ) , … }</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list --></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Les successeurs de A sont les sommets B et F , le seul prédécesseur de A est G . Le degré du sommet A est égal à 3 : d ( A ) = d + ( A ) + d − ( A ) = 2 + 1 = 3 .</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>A , B , C , D est un chemin mais A , B , F n'en est pas un car il n'y a pas d'arc ( B , F ) (de B vers F ).</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>A , F , G , A est un circuit.</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Il n'y a pas de boucle ici.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="graphes-valués">Graphes valués</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Certains graphes (orientés ou non) sont dits <em>valués</em> : on ajoute un coût (ou valuation, ou poids) à chaque arête/arc. Dans le cas d'un graphe représentant un réseau routier, le coût sur chaque arête pourrait, par exemple, être la distance entre deux villes.</p>
<!-- /wp:paragraph -->

<!-- wp:image -->
<figure class="wp-block-image"><img src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/graphe_value.png" alt="graphe valué"/></figure>
<!-- /wp:image -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading" id="représentations-d'un-graphe">Représentations d'un graphe</h1>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="représentation-par-matrice-d'adjacence">Représentation par matrice d'adjacence</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Une <strong>matrice</strong> M est un tableau de nombres, qui peut être représenté en machine par un tableau de tableaux (ou une liste de listes) noté <code>matrice</code>. Chaque nombre de cette matrice est repéré par son numéro de ligne i et son numéro de colonne j. On note ce nombre M i , j et on peut y accéder par l'instruction <code>matrice[i][j]</code>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Un graphe à sommets peut être représentée par une <strong>matrice d'adjacence</strong> de taille n x n , où la valeur du coefficient d'indice i , j</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>dépend de l'existence d'une arête ou d'un arc reliant les sommets i et j.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>Exemple (graphe non orienté)</strong> : Si les sommets A , B , C , …du graphe</p>
<!-- /wp:paragraph -->

<!-- wp:image -->
<figure class="wp-block-image"><img src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/graphe_non_oriente.png" alt="graphe non orienté"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>sont respectivement numérotés 0, 1 , 2, etc. alors sa matrice d'adjacence est </p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":4315,"sizeSlug":"full","linkDestination":"media","align":"center"} -->
<figure class="wp-block-image aligncenter size-full"><a href="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2025/10/image.png"><img src="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2025/10/image.png" alt="" class="wp-image-4315"/></a></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Par exemple, le sommet C correspond à la troisième ligne. Celle-ci contient dans cet ordre les nombres 0, 1, 0, 1, 0, 1, 0 donc cela signifie qu'il y a des <strong>arêtes</strong> ( C , B ) , ( C , D ) et ( C , F ) (les 1) mais pas entre C et les sommets A, C, E et G (les 0).</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Cette matrice peut être mémorisée en machine par le tableau de tableaux suivant.</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>matrice = &#91;
    &#91;0, 1, 0, 0, 0, 1, 1],
    &#91;1, 0, 1, 0, 0, 1, 0],
    &#91;0, 1, 0, 1, 0, 1, 0],
    &#91;0, 0, 1, 0, 1, 0, 0],
    &#91;0, 0, 0, 1, 1, 1, 0],
    &#91;1, 1, 1, 0, 1, 0, 1],
    &#91;1, 0, 0, 0, 0, 1, 0]
]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph {"gradient":"pale-ocean"} -->
<p class="has-pale-ocean-gradient-background has-background">Dans le cas d'un graphe non orienté, la matrice d'adjacence est nécessairement <em>symétrique</em> par rapport à sa diagonale : on a M i , j = M j , i</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>.</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p><strong>Exemple (graphe orienté)</strong> :</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>C'est le même principe en faisant attention au sens des arcs : M i , j = 1 s'il y a un arc d'origine i et d'extrémité j et M i , j = 0 sinon. Ainsi, le graphe</p>
<!-- /wp:paragraph -->

<!-- wp:image -->
<figure class="wp-block-image"><img src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/graphe_oriente.png" alt="graphe non orienté"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>a pour matrice d'adjacence </p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":4317,"sizeSlug":"full","linkDestination":"media","align":"center"} -->
<figure class="wp-block-image aligncenter size-full"><a href="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2025/10/image-1.png"><img src="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2025/10/image-1.png" alt="" class="wp-image-4317"/></a></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Par exemple, le sommet C correspond à la troisième ligne. Celle-ci contient dans cet ordre les nombres 0, 0, 0, 1, 0, 1, 0 donc cela signifie qu'il y a des <strong>arcs</strong>  (C,D) et (C,F) (les 1) mais pas entre C et les autres sommets (les 0).</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph {"gradient":"pale-ocean"} -->
<p class="has-pale-ocean-gradient-background has-background">Comme les arcs ont un sens, la matrice d'adjacence d'un graphe orienté n'est généralement pas symétrique.</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="représentation-par-listes-des-successeurs">Représentation par listes des successeurs</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Une autre façon de représenter un graphe est d'associer à chaque sommet la liste des sommets auxquels il est relié. Dans le cas d'un graphe orienté, on parle de <strong>liste de successeurs</strong>, alors que dans le cas d'un graphe non orienté on parle de <strong>liste de voisins</strong>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Une façon simple et efficace est d'utiliser un <em>dictionnaire</em> où chaque sommet est associé à la liste de ses successeurs/voisins.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>Exemples</strong> :</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Le graphe non orienté <img width="400" src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/graphe_non_oriente.png" alt="graphe non orienté"> peut être représenté par le dictionnaire suivant, où les clés sont les sommets et les valeurs sont les listes de voisins.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:code -->
<pre class="wp-block-code"><code>dico1 = {
    "A": &#91;"B", "F", "G"],
    "B": &#91;"A", "C", "F"],
    "C": &#91;"B", "D", "F"],
    "D": &#91;"C", "E"],
    "E": &#91;"D", "E", "F"],
    "F": &#91;"A", "B", "C", "E", "G"],
    "G": &#91;"A", "F"]
}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Le graphe orienté <img width="400" src="https://info-mounier.fr/terminale_nsi/structures_donnees/data/graphe_oriente.png" alt="graphe non orienté"> peut être représenté par le dictionnaire suivant, où les clés sont les sommets et les valeurs sont les listes de successeurs.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:code -->
<pre class="wp-block-code"><code>dico2 = {
    "A": &#91;"B", "F"],
    "B": &#91;"C"],
    "C": &#91;"D", "F"],
    "D": &#91;"C"],
    "E": &#91;"D"],
    "F": &#91;"B", "E", "G"],
    "G": &#91;"A"]
}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="efficacité-des-représentations">Efficacité des représentations</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>La matrice d'adjacence est simple à mettre en œuvre mais nécessite un espace mémoire proportionnel à n x n (où n est le nombre de sommets). Ainsi, un graphe de 1000 sommets nécessite une matrice d'un million de nombres même si le graphe contient peu d'arêtes/arcs. Pour le même graphe contenant peu d'arêtes/arcs, le dictionnaire ne mémoriserait pour chaque sommet que les voisins/successeurs (les 1) sans avoir à mémoriser les autres (les 0). En revanche, pour un graphe contenant beaucoup d'arêtes/arcs, la dictionnaire occuperait plus d'espace mémoire que la matrice d'adjacence.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Cela implique en outre que l'accès aux voisins/successeurs d'un sommet est plus rapide avec le dictionnaire car il n'est pas nécessaire de parcourir toute la ligne de la matrice ( n valeurs) alors même que celle-ci peut ne contenir que très peu de 1.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>De plus, l'utilisation d'un dictionnaire permet de nommer les sommets sans ambiguité et ne les limite pas à des entiers comme c'est le cas pour la matrice d'adjacence (même si on peut associer chacun de ces entiers au sommet correspondant, ce que nous avons fait précédemment).</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Enfin, au lieu d'utiliser le type liste (<code>list</code> de Python ici) pour mémoriser les voisins/successeurs, on peut avantageusement utiliser le type ensemble (type prédéfini <code>set</code> de Python) qui est une structure de données permettant un accès plus efficace aux éléments (l'implémentation se fait par des <em>tables de hachage</em>, hors programme de NSI).</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph {"gradient":"pale-ocean"} -->
<p class="has-pale-ocean-gradient-background has-background">✏️ <strong>A faire</strong> : tous les exercices du notebook d'activités !</p>
<!-- /wp:paragraph -->

<!-- wp:file {"id":4320,"href":"https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2025/10/T1_C5_Graphes.tar"} -->
<div class="wp-block-file"><a id="wp-block-file--media-b8881898-93ca-4548-9602-ee4c3422d280" href="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2025/10/T1_C5_Graphes.tar">T1_C5_Graphes</a><a href="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2025/10/T1_C5_Graphes.tar" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-b8881898-93ca-4548-9602-ee4c3422d280">Télécharger</a></div>
<!-- /wp:file --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading" id="implémentations">Implémentations</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>La fin de ce cours résume une partie de ce qui a été fait en exercices, notamment deux implémentations du type <code>GrapheNonOriente</code> défini par l'interface suivante :</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li><code>faire_graphe(sommets)</code> pour construire un graphe (sans les arêtes) à partir de la liste <code>sommets</code> de ses sommets.</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><code>ajouter_arete(G, x, y)</code> pour ajouter une arête entre les sommets <code>x</code> et <code>y</code> du graphe <code>G</code>.</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><code>sommets(G)</code> pour accéder à la liste des sommets du graphe <code>G</code>.</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><code>voisins(G, x)</code> pour accéder à la liste des voisins du sommet <code>x</code> du graphe <code>G</code>.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>La première implémentation se fait par une classe <code>GrapheNoMa</code> s'appuyant sur la représentation par une matrice d'adjacence et la seconde par une classe <code>GrapheNoLs</code> s'appuyant sur les listes de successeurs (qui sont les voisins dans le cas d'un graphe non orienté).</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>On termine en présentant comment passer d'une représentation à l'autre.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="par-une-matrice-d'adjacence">Par une matrice d'adjacence</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Voici la classe <code>GrapheNoMa</code> s'appuyant sur une matrice d'adjacence.</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>class GrapheNoMa:
    def __init__ (self, sommets):
        self.som = sommets
        self.dimension = len(sommets)
        self.adjacence = &#91;&#91;0 for i in range(self.dimension)] for j in range(self.dimension)]

    def ajouter_arete(self, x, y):
        i = self.som.index(x)
        j = self.som.index(y)
        self.adjacence&#91;i]&#91;j] = 1
        self.adjacence&#91;j]&#91;i] = 1

    def sommets(self):
        return self.som

    def voisins(self, x):
        i = self.som.index(x)
        return &#91;self.som&#91;j] for j in range(self.dimension) if self.adjacence&#91;i]&#91;j] == 1]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="par-une-liste-de-successeurs">Par une liste de successeurs</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Voici la classe <code>GrapheNoLs</code> s'appuyant sur un dictionnaire contenant les listes de successeurs de chaque sommet.</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>class GrapheNoLs:
    def __init__ (self, sommets):
        self.som = sommets
        self.dic = {sommet: &#91;] for sommet in self.som} # création par compréhension

    def ajouter_arete(self, x, y):
        if y not in self.dic&#91;x]:
            self.dic&#91;x].append(y)
        if x not in self.dic&#91;y]:
            self.dic&#91;y].append(x)

    def sommets(self):
        return self.som

    def voisins(self, x):
        return self.dic&#91;x]</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>Python</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>On peut alors créer des graphes comme objets de ces deux classes et leur ajouter des arrêtes.</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&gt;&gt;&gt; g1 = GrapheNoMa(&#91;"a", "b", "c", "d"])  # implémentation par matrice d'adjacence
&gt;&gt;&gt; g1.ajouter_arete("a", "b")
&gt;&gt;&gt; g1.ajouter_arete("a", "c")
&gt;&gt;&gt; g1.ajouter_arete("c", "d")</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>Python</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&gt;&gt;&gt; g2 = GrapheNoLs(&#91;"a", "b", "c", "d"])  # implémentation par liste de successeurs
&gt;&gt;&gt; g2.ajouter_arete("a", "b")
&gt;&gt;&gt; g2.ajouter_arete("a", "c")
&gt;&gt;&gt; g2.ajouter_arete("c", "d")</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>On peut accéder aux graphes à travers les fonctions de l'interface du type abstrait de manière totalement identique.</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&gt;&gt;&gt; g1.sommets()
&#91;'a', 'b', 'c', 'd']
&gt;&gt;&gt; g1.voisins("c")
&#91;'a', 'd']</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&gt;&gt;&gt; g2.sommets()
&#91;'a', 'b', 'c', 'd']
&gt;&gt;&gt; g2.voisins("c")
&#91;'a', 'd']</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>En Python, un utilisateur malin pourra observer la façon dont sont mémorisées les graphes dans les deux cas :</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&gt;&gt;&gt; g1.adjacence
&#91;&#91;0, 1, 1, 0], &#91;1, 0, 0, 0], &#91;1, 0, 0, 1], &#91;0, 0, 1, 0]]
&gt;&gt;&gt; g2.dic
{'a': &#91;'b', 'c'], 'b': &#91;'a'], 'c': &#91;'a', 'd'], 'd': &#91;'c']}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Mais nous avons vu qu'il est possible de palier à ce problème en définissant une méthode de représentation identique dans chacune des deux classes pour <em>masquer</em> cette différence d'implémentation, qui importe peu à l'utilisateur de la classe.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="passage-d'une-représentation-à-l'autre">Passage d'une représentation à l'autre</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Les deux implémentations sont totalement équivalentes et on peut passer de l'une à l'autre simplement en énumérant les sommets et les voisins depuis une représentation tout en construisant l'autre représentation.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Par exemple, la fonction suivante permet de passer d'une matrice d'adjacence à une liste de successeurs (la fonction de traduction réciproque est similaire).</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>def ma_to_ls(gma):
    gls = GrapheNoLs(gma.sommets())
    for x in gma.sommets():
        for y in gma.voisins(x):
            gls.ajouter_arete(x,y)
    return gls</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&gt;&gt;&gt; g3 = ma_to_ls(g1)
&gt;&gt;&gt; g1.adjacence  # représentation de départ
&#91;&#91;0, 1, 1, 0], &#91;1, 0, 0, 0], &#91;1, 0, 0, 1], &#91;0, 0, 1, 0]]
&gt;&gt;&gt; g3.dic  # traduction
{'a': &#91;'b', 'c'], 'b': &#91;'a'], 'c': &#91;'a', 'd'], 'd': &#91;'c']}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph {"gradient":"pale-ocean"} -->
<p class="has-pale-ocean-gradient-background has-background">On peut implémenter le type abstrait <code>GrapheOriente</code> de façon quasiment similaire (fait en exercices).</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading" id="bilan">Bilan</h1>
<!-- /wp:heading -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Le <strong>graphe</strong> est une structure de données permettant de modéliser de nombreuses situations de la vie courante.</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Il est définit par un ensemble de <em>sommets</em> et de <em>liaisons</em>. Ces liaisons peuvent être orientées ou non et on les appelle alors respectivement des <strong>arcs</strong> ou des <strong>arêtes</strong>.</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>On peut représenter en machine un graphe par une <em>matrice d'adjacence</em> ou par un dictionnaire contenant les <em>listes de successeurs</em> (de chaque sommet).</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>La programmation par des classes de deux implémentations d'un graphe non orienté (resp. orienté) a prouvé que celles-ci étaient indépendantes de l'interface du type abstrait <code>GrapheNonOriente</code> (resp. <code>GrapheOriente</code>) et qu'elles sont équivalentes, on peut notamment passer de l'une à l'autre facilement.</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Nous verrons dans un prochaine chapitre différents algorithmes sur les graphes (parcours en profondeur d'abord, en largeur d'abord, repérer des cycles, recherche de chemin dans un graphe).</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:paragraph -->
<p><strong>Références :</strong></p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Equipe pédagoqique DIU EIL, Université de Nantes.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:paragraph -->
<p>Germain BECKER, Lycée Mounier, ANGERS</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":4323,"sizeSlug":"full","linkDestination":"media","align":"left"} -->
<figure class="wp-block-image alignleft size-full"><a href="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2025/10/image-2.png"><img src="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2025/10/image-2.png" alt="" class="wp-image-4323"/></a></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->]]></content-encoded>
			<excerpt-encoded><![CDATA[]]></excerpt-encoded>
			<wp-post_id>4308</wp-post_id>
			<wp-post_date>2025-10-07 15:27:52</wp-post_date>
			<wp-post_date_gmt>2025-10-07 13:27:52</wp-post_date_gmt>
				</item>
</upm-export>
