<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Terminale/Graphes</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Définition d'un graphe (sommets, arêtes), graphes orientés<br/>
et non orientés, pondérés, représentations (matrice<br/>
d'adjacence, liste d'adjacence), parcours en largeur<br/>
et en profondeur, plus court chemin, applications.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q01 : Définition d'un graphe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un <strong>graphe</strong> en informatique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les graphes sont omniprésents : transport, réseaux<br/>
sociaux, web (pages reliées par hyperliens), réseaux<br/>
électriques, planification de tâches, recommandations.<br/>
Connaître les algorithmes de graphes est essentiel.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un type d'arbre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est plutôt l'inverse. Un arbre est un<br/>
cas particulier de graphe (acyclique connexe).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une représentation visuelle de données numériques (camembert, histogramme)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait un <strong>graphique</strong>. Un graphe en<br/>
informatique est une structure mathématique<br/>
différente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un ensemble de sommets (ou nœuds) reliés par des arêtes (ou arcs si orientés)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est la définition mathématique<br/>
standard. Un graphe modélise n'importe quelle<br/>
relation entre objets : réseau routier, réseau<br/>
social, dépendances de tâches, etc.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire trié</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un dictionnaire est une<br/>
structure associant des<br/>
clés à des valeurs, sans<br/>
rapport avec un ensemble<br/>
de sommets reliés par des<br/>
arêtes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q02 : Graphe orienté</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre un graphe <strong>orienté</strong> et<br/>
un graphe <strong>non orienté</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cas typique : réseau routier (orienté si rues à sens<br/>
unique, non orienté si toutes en double sens). Le<br/>
web est orienté (un lien va d'une page à l'autre<br/>
sans symétrie).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Dans un graphe orienté, chaque arête a un sens (de A vers B), alors que dans un graphe non orienté, l'arête relie A et B sans préférence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on parle d'<strong>arcs</strong> pour les<br/>
arêtes orientées. Exemple orienté : suivre<br/>
quelqu'un sur Twitter (asymétrique). Exemple non<br/>
orienté : amitié sur Facebook (symétrique).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un graphe orienté n'a pas de cycle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un graphe orienté <strong>peut</strong> avoir des<br/>
cycles. Sans cycle, on parle de DAG (graphe<br/>
orienté acyclique).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le graphe orienté contient plus de sommets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec le nombre de sommets.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un graphe non orienté est plus rapide à parcourir</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la vitesse de parcours dépend du nombre<br/>
de sommets et arêtes, pas de l'orientation.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q03 : Graphe pondéré</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un graphe <strong>pondéré</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un graphe peut être à la fois orienté ET pondéré<br/>
(cas d'un GPS, d'un réseau de transport, etc.).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un graphe avec beaucoup d'arêtes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est plutôt un graphe <strong>dense</strong>. Aucun<br/>
rapport avec « pondéré ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un graphe partagé entre plusieurs utilisateurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le partage entre<br/>
utilisateurs relève d'un<br/>
aspect logiciel sans<br/>
rapport avec la<br/>
pondération des arêtes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un graphe trop lourd à stocker en mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : « pondéré » est un terme technique précis,<br/>
pas une métaphore.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un graphe où chaque arête porte un poids (valeur numérique), représentant par exemple une distance, un coût, un temps</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par exemple, un GPS représente<br/>
les routes par un graphe pondéré (poids = temps<br/>
de trajet). Les algorithmes de plus court chemin<br/>
(Dijkstra) exploitent ces poids.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q04 : Matrice d'adjacence</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une <strong>matrice d'adjacence</strong> d'un graphe à $n$ sommets est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour un graphe non orienté, la matrice est<br/>
<strong>symétrique</strong> ($M[i][j] = M[j][i]$). Pour un<br/>
graphe orienté, elle peut ne pas l'être.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une matrice $n \times n$ où $M[i][j] = 1$ s'il existe une arête entre $i$ et $j$, sinon $0$ (ou le poids de l'arête si pondéré)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'une des deux représentations<br/>
principales des graphes. Avantage : test<br/>
d'arête en $O(1)$. Inconvénient : consomme<br/>
$O(n^2)$ d'espace, même pour des graphes creux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tableau $1 \times n$ contenant les degrés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait un tableau de degrés, pas une<br/>
matrice d'adjacence.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arbre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un arbre est une<br/>
structure de données<br/>
spécifique, sans rapport<br/>
avec la représentation<br/>
d'un graphe par une<br/>
matrice.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire de listes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est plutôt une <strong>liste d'adjacence</strong>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q05 : Liste d'adjacence</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une <strong>liste d'adjacence</strong> d'un graphe consiste à :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choix entre matrice et liste : matrice pour graphes<br/>
<strong>denses</strong> (peu de zéros) ou si on a besoin de<br/>
tester très souvent l'existence d'une arête. Liste<br/>
pour graphes <strong>creux</strong> (cas le plus fréquent en<br/>
pratique).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Stocker uniquement les sommets isolés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on stocke tous les sommets.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier les sommets par degré</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun tri requis.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Numéroter les arêtes de $1$ à $m$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est plutôt une numérotation, pas une<br/>
liste d'adjacence.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Stocker pour chaque sommet la liste de ses voisins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour le sommet $v$, on stocke la<br/>
liste de tous les sommets directement reliés à<br/>
lui. Plus efficace en mémoire que la matrice<br/>
d'adjacence pour les graphes <strong>creux</strong><br/>
(peu d'arêtes par sommet). Espace : $O(n + m)$<br/>
avec $m$ arêtes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q06 : Parcours en largeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le parcours en <strong>largeur</strong> d'un graphe :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Application clé : trouver le plus court chemin<br/>
<strong>en nombre d'arêtes</strong> depuis un sommet de départ.<br/>
Aussi utilisé pour tester la connexité, calculer<br/>
les composantes connexes, etc.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Visite d'abord tous les voisins du sommet de départ, puis tous leurs voisins non visités, et ainsi de suite par niveaux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'algorithme de référence<br/>
pour explorer un graphe en respectant la distance<br/>
en nombre d'arêtes. Implémentation : avec une<br/>
<strong>file</strong> (FIFO).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parcourt la branche la plus profonde d'abord</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le parcours en <strong>profondeur</strong><br/>
(parcours en profondeur).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trie les sommets par valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun tri par valeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Visite uniquement les feuilles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tous les sommets accessibles sont<br/>
visités.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q07 : Parcours en profondeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le parcours en <strong>profondeur</strong> d'un graphe :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mémo : <strong>largeur = file = FIFO</strong> ; <strong>profondeur =<br/>
pile = LIFO</strong>. Les deux parcours visitent tous les<br/>
sommets accessibles, mais dans un ordre différent.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Explore aussi loin que possible une branche avant de revenir en arrière pour explorer une autre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : implémentation typique avec une<br/>
<strong>pile</strong> (explicite ou implicite via la<br/>
récursivité). Le parcours en profondeur est<br/>
utile pour la détection de cycles, le tri<br/>
topologique, la recherche de composantes<br/>
fortement connexes, etc.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trie les sommets par profondeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun tri par profondeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Visite tous les voisins du sommet de départ avant d'aller plus loin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le parcours en <strong>largeur</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Calcule la longueur totale du graphe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune notion de longueur globale.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q08 : Structure utilisée par parcours en largeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour implémenter un parcours en largeur, quelle structure<br/>
de données utilise-t-on naturellement ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>En Python : <code>from collections import deque ;<br/>
f = deque([depart])</code>. Avec <code>f.append(v)</code> pour enfiler<br/>
et <code>f.popleft()</code> pour défiler, en $O(1)$ chacun.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un dictionnaire n'a pas la sémantique<br/>
d'ordre nécessaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une pile</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la pile correspond au parcours en<br/>
<strong>profondeur</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une file (FIFO)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on enfile le sommet de départ,<br/>
puis tant que la file n'est pas vide on défile<br/>
un sommet, on visite, et on enfile ses voisins<br/>
non encore visités. C'est exactement le parcours en largeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune structure</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il faut bien stocker les sommets en<br/>
attente.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q09 : Structure utilisée par parcours en profondeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le parcours en profondeur peut s'implémenter en utilisant :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Récursivité = pile implicite. Itératif avec pile =<br/>
pile explicite. Les deux donnent le même résultat<br/>
(à l'ordre des voisins près). La version récursive<br/>
est souvent plus claire.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une file uniquement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la file donne un parcours en largeur,<br/>
pas en profondeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un graphe imbriqué</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description ne<br/>
correspond pas à une<br/>
structure standard<br/>
utilisée pour le<br/>
parcours d'un graphe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arbre binaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un arbre est une structure différente,<br/>
pas l'outil de parcours.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une pile (explicite ou la pile d'appels via la récursivité)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la récursivité utilise<br/>
implicitement la pile d'appels. La version<br/>
itérative utilise explicitement une pile (<code>list</code><br/>
avec <code>append</code> et <code>pop</code>).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q10 : Plus court chemin</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour trouver le plus court chemin (en nombre d'arêtes)<br/>
entre deux sommets dans un graphe <strong>non pondéré</strong>, on<br/>
utilise :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour graphe pondéré à poids <strong>positifs</strong> : Dijkstra<br/>
($O((n + m) \log n)$). Pour graphe avec poids<br/>
négatifs : Bellman-Ford ($O(nm)$). parcours en largeur s'utilise<br/>
quand toutes les arêtes ont un poids identique<br/>
(typiquement, $1$).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tri topologique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est utile pour les DAG, pas pour les<br/>
plus courts chemins.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un parcours en largeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le parcours en largeur visite les sommets par<br/>
ordre croissant de distance (en arêtes) depuis<br/>
le sommet de départ. Le premier moment où on<br/>
atteint le sommet d'arrivée donne la distance<br/>
minimale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un parcours en profondeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : parcours en profondeur ne donne pas le plus court chemin<br/>
en général. Il peut prendre une route longue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'algorithme de Dijkstra</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Dijkstra est pour les graphes<br/>
<strong>pondérés</strong> (poids positifs). Pour un graphe non<br/>
pondéré, parcours en largeur suffit.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q11 : Degré d'un sommet</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le <strong>degré</strong> d'un sommet dans un graphe non orienté<br/>
est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Théorème classique (Euler) : la somme des degrés<br/>
d'un graphe non orienté est $2m$ (deux fois le<br/>
nombre d'arêtes), car chaque arête contribue $1$ à<br/>
deux sommets.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le nombre d'arêtes incidentes à ce sommet (i.e. le nombre de voisins).</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par exemple, dans le graphe<br/>
$\{(A, B), (A, C), (B, C)\}$, le sommet $A$ est<br/>
de degré $2$. Pour un graphe orienté, on<br/>
distingue le <strong>degré entrant</strong> et le <strong>degré<br/>
sortant</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le poids de l'arête la plus lourde incidente au sommet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le degré d'un sommet<br/>
est un nombre d'arêtes,<br/>
et non un poids. Le<br/>
poids n'intervient que<br/>
dans les graphes<br/>
pondérés, et n'est pas<br/>
lié à la notion de<br/>
degré.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La distance jusqu'à la racine</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il n'y a pas de racine dans un graphe<br/>
général. Confusion avec les arbres.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sa profondeur dans un parcours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la profondeur est une notion liée au<br/>
parcours, pas au sommet en soi.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q12 : Cycle dans un graphe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un <strong>cycle</strong> dans un graphe est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un <strong>arbre</strong> est un graphe connexe sans cycle. C'est<br/>
cette absence de cycle qui caractérise l'arbre par<br/>
rapport au graphe général.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un sommet isolé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un sommet isolé n'a aucune arête. Ce<br/>
n'est pas un cycle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une arête répétée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est un multi-graphe, notion<br/>
différente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un sommet de degré pair</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas la définition d'un cycle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une suite d'arêtes qui revient à son point de départ</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par exemple, le chemin<br/>
$A \to B \to C \to A$ forme un cycle. Détecter<br/>
les cycles est important : un graphe sans cycle<br/>
est appelé <strong>acyclique</strong> (DAG si orienté).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q13 : Graphe connexe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un graphe non orienté est <strong>connexe</strong> quand :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le parcours en largeur ou parcours en profondeur depuis un sommet visite toute sa<br/>
<strong>composante connexe</strong>. Si on n'atteint pas tous les<br/>
sommets, le graphe n'est pas connexe.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il est orienté</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la connexité concerne les graphes<br/>
orientés ET non orientés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il a beaucoup d'arêtes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la quantité ne suffit pas. C'est la<br/>
structure qui compte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il existe un chemin entre toute paire de sommets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on peut « atteindre » n'importe<br/>
quel sommet depuis n'importe quel autre. Si on<br/>
enlève cette propriété, on peut avoir plusieurs<br/>
<strong>composantes connexes</strong> (groupes isolés).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il a au moins $n$ arêtes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un graphe connexe à $n$ sommets a au<br/>
moins $n - 1$ arêtes (cas de l'arbre), mais<br/>
cela n'est pas suffisant.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q14 : DAG</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que signifie l'acronyme <strong>DAG</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sur un DAG, le <strong>tri topologique</strong> est possible :<br/>
ranger les sommets dans un ordre tel que chaque<br/>
arête $u \to v$ va d'un sommet plus tôt vers un<br/>
sommet plus tard. Utilisé pour ordonnancer des<br/>
tâches respectant leurs dépendances.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Décomposition d'Algorithme par Graphe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sigle inventé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Distribution Aléatoire de Graphes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sigle inventé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Données Algorithmiques Génériques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sigle inventé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Directed Acyclic Graph (graphe orienté acyclique)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un DAG est un graphe orienté<br/>
sans cycle. Très utile pour modéliser des<br/>
dépendances : tâches d'un projet, dépendances<br/>
de modules, généalogie, calculs, etc.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q15 : Espace mémoire matrice vs liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour un graphe à $n = 1000$ sommets et $m = 5000$<br/>
arêtes, quelle représentation est la plus économe en<br/>
mémoire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Densité d'un graphe : $d = m / \binom{n}{2}$. Pour<br/>
$d$ proche de $1$ (graphe dense), la matrice peut<br/>
être préférable. Pour $d$ proche de $0$ (creux), la<br/>
liste est meilleure.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste d'adjacence ($O(n + m) = 6000$ entrées)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la liste d'adjacence consomme<br/>
de l'ordre du nombre d'arêtes plus le nombre de<br/>
sommets. Beaucoup mieux que la matrice quand le<br/>
graphe est <strong>creux</strong> ($m \ll n^2$), ce qui est<br/>
le cas en pratique pour beaucoup d'applications.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La matrice d'adjacence ($O(n^2) = 10^6$ cases)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la matrice consomme bien plus que la<br/>
liste pour un graphe creux. La liste vaut mieux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune différence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la différence est importante, surtout<br/>
pour les graphes creux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cela dépend du langage de programmation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la complexité asymptotique est<br/>
indépendante du langage.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q16 : Parcours en largeur et distance</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Avec un parcours en largeur depuis le sommet $s$, on calcule pour chaque<br/>
sommet $v$ atteignable :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Au moment où parcours en largeur découvre un sommet, il peut<br/>
enregistrer (a) la distance, (b) le sommet<br/>
« parent » dans le parcours en largeur. Avec cela, on peut<br/>
reconstituer le chemin le plus court en arêtes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les sommets isolés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : parcours en largeur visite seulement les sommets<br/>
accessibles depuis $s$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tous les chemins possibles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trop d'information. parcours en largeur calcule<br/>
uniquement la distance minimale, pas tous les<br/>
chemins.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le poids minimal du chemin $s \to v$ (si pondéré)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : parcours en largeur calcule la distance en <strong>nombre<br/>
d'arêtes</strong>, pas en poids. Pour les poids,<br/>
utiliser Dijkstra.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le nombre minimal d'arêtes du chemin $s \to v$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est précisément ce que parcours en largeur<br/>
calcule. Très utile dans des graphes où toutes<br/>
les arêtes sont équivalentes (réseau social,<br/>
jeu de plateau, etc.).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q17 : Application réseau social</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur un réseau social, on veut trouver tous les amis<br/>
« à distance $2$ » (amis d'amis) d'un utilisateur $u$.<br/>
Quel algorithme utiliser ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette technique est utilisée par LinkedIn, Facebook,<br/>
etc. La théorie des « six degrés de séparation »<br/>
affirme que dans le graphe social mondial, la<br/>
distance maximale est environ $6$.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un parcours en largeur, en s'arrêtant à la profondeur $2$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : parcours en largeur avec une limite de<br/>
profondeur. À profondeur $0$ : $u$ ; à $1$ : ses<br/>
amis ; à $2$ : les amis des amis (sans compter<br/>
$u$ ni ses amis directs si on veut). Très<br/>
utilisé pour la recommandation d'amis.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tri des amis par valeur d'identifiant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le tri d'une liste n'a<br/>
aucun rapport avec la<br/>
recherche d'amis à une<br/>
distance donnée dans un<br/>
réseau social.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un parcours en profondeur sans limite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : parcours en profondeur n'organise pas les visites par<br/>
niveaux ; difficile d'extraire « distance $2$ ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une recherche dichotomique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie suppose une structure<br/>
ordonnée, ce qui n'est pas le cas d'un graphe<br/>
social.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q18 : Liste d'adjacence en Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment représenter naturellement une liste d'adjacence<br/>
en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variante orientée objet : créer une classe <code>Graphe</code><br/>
avec méthodes <code>ajouter_sommet</code>, <code>ajouter_arete</code>,<br/>
<code>voisins</code>, etc. Plus propre pour des projets<br/>
structurés. Mais en NSI, le dictionnaire suffit<br/>
souvent.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comme un entier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un entier ne peut pas représenter une<br/>
structure complexe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comme un tuple unique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trop limité pour stocker la structure.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comme une chaîne de caractères</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : difficile à manipuler et inefficace.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Comme un dictionnaire où la clé est un sommet et la valeur est la liste de ses voisins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par exemple,<br/>
<code>g = {'A': ['B', 'C'], 'B': ['A'], 'C': ['A']}</code>.<br/>
Très lisible et efficace. On accède aux voisins<br/>
en $O(1)$ via la clé.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q19 : Code parcours en largeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle fonction Python implémente correctement un parcours en largeur<br/>
depuis un sommet <code>depart</code> dans un graphe <code>g</code> (dictionnaire) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'ensemble <code>visites</code> est crucial : sans lui, sur un<br/>
graphe avec cycle, on bouclerait indéfiniment.<br/>
C'est l'une des erreurs classiques sur les graphes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def bfs(g, depart):
    return [v for v in g]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : retourne tous les sommets sans<br/>
parcours. Ne respecte pas la connexité depuis<br/>
<code>depart</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def bfs(g, depart):
    visites = {depart}
    from collections import deque
    f = deque([depart])
    while f:
        v = f.popleft()
        for w in g[v]:
            if w not in visites:
                visites.add(w)
                f.append(w)
    return visites</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : structure standard. On garde une<br/>
ensemble <code>visites</code> pour éviter les boucles<br/>
infinies sur les graphes cycliques. La file<br/>
impose le parcours en largeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def bfs(g, depart):
    return g[depart]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : retourne uniquement les voisins<br/>
directs, pas le parcours complet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def bfs(g, depart):
    return sorted(g.keys())</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trie les clés sans parcourir le graphe.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q20 : Arbre comme cas particulier</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un <strong>arbre</strong> (au sens informatique) est un cas<br/>
particulier de :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tout arbre à $n$ sommets a exactement $n - 1$<br/>
arêtes. Si l'on a $n$ sommets, $n - 1$ arêtes et la<br/>
connexité, alors c'est un arbre (et donc sans<br/>
cycle). Triple caractérisation.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Graphe : c'est un graphe non orienté, connexe et acyclique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tous les concepts d'arbre<br/>
(racine, hauteur, parcours) sont applicables aux<br/>
graphes plus généralement, mais l'arbre garantit<br/>
des propriétés (chemin unique entre deux<br/>
sommets) qui simplifient les algorithmes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tableau</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un tableau est linéaire, un arbre<br/>
hiérarchique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>File</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : file et arbre sont distincts.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pile</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pile et arbre sont des structures<br/>
totalement différentes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q21 : Algorithme de Dijkstra</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>L'algorithme de <strong>Dijkstra</strong> calcule les plus courts<br/>
chemins depuis une source dans un graphe pondéré. Quelle<br/>
est sa contrainte sur les poids ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dijkstra s'implémente classiquement avec une <strong>file<br/>
de priorité</strong> (tas), donnant une complexité<br/>
$O((n + m) \log n)$. Très utilisé dans les GPS,<br/>
les protocoles de routage et les jeux vidéo<br/>
(recherche de chemin pour les déplacements de<br/>
personnages).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les poids doivent être positifs ou nuls (pas de poids négatifs)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec des poids négatifs,<br/>
l'invariant glouton de Dijkstra ne tient plus.<br/>
Pour les poids négatifs, utiliser Bellman-Ford.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les poids doivent être entiers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Dijkstra fonctionne avec des poids<br/>
réels.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les poids doivent être triés à l'avance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun tri préalable requis. Dijkstra<br/>
gère lui-même la priorité via une file de<br/>
priorité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les poids doivent être tous identiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : si tous les poids sont identiques, parcours en largeur<br/>
suffit. Dijkstra est conçu pour des poids<br/>
variables.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q22 : Tri topologique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un <strong>tri topologique</strong> d'un DAG :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Algorithmes : algorithme de Kahn (par degré<br/>
entrant) ou parcours en profondeur avec post-ordre inversé. Application<br/>
classique : compilation, ordonnancement de<br/>
makefiles, calcul de tableaux d'événements.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Range les sommets dans un ordre tel que pour chaque arête $u \to v$, $u$ apparaît avant $v$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est un ordre <strong>respectant les<br/>
dépendances</strong>. Très utile pour ordonnancer des<br/>
tâches : faire $u$ avant $v$ si $u$ est requis<br/>
pour $v$. Plusieurs ordres valides sont possibles<br/>
en général.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trie les sommets par valeur croissante</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas un tri par valeur. C'est un tri<br/>
structurel basé sur les dépendances.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Élimine les cycles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un tri topologique requiert un graphe<br/>
<strong>déjà</strong> acyclique (DAG). On ne supprime pas de<br/>
cycles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trie les sommets par degré</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de tri par degré.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q23 : Composantes connexes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour calculer les <strong>composantes connexes</strong> d'un graphe<br/>
non orienté, on peut :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette technique fonctionne aussi avec une<br/>
structure d'<strong>Union-Find</strong> (très efficace pour<br/>
les graphes statiques). En NSI, le parcours en largeur/parcours en profondeur suffit<br/>
largement.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Utiliser une recherche dichotomique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas adapté aux graphes non ordonnés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Lancer un parcours en largeur (ou parcours en profondeur) depuis chaque sommet non encore visité ; chaque parcours visite une composante</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : algorithme classique en $O(n + m)$.<br/>
Tant qu'il reste des sommets non visités, on en<br/>
choisit un et on lance un parcours qui marque<br/>
tous les sommets de sa composante. On compte le<br/>
nombre de parcours lancés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Compter les sommets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ça donne $n$, pas le nombre de<br/>
composantes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier les sommets par numéro</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le tri des sommets ne<br/>
révèle pas leur<br/>
appartenance à une<br/>
composante connexe : il<br/>
faut suivre les arêtes<br/>
du graphe pour<br/>
déterminer cette<br/>
appartenance.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q24 : Arbre couvrant</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un <strong>arbre couvrant</strong> d'un graphe connexe est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Application classique de l'arbre couvrant minimal :<br/>
réseaux électriques (minimiser la longueur de<br/>
câble), réseaux informatiques, plans<br/>
d'urbanisation. Algorithmes : Kruskal (glouton sur<br/>
les arêtes), Prim (glouton sur les sommets).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un sous-graphe qui contient toutes les arêtes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le graphe lui-même.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une racine du graphe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un graphe général n'a pas de racine.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un cycle qui passe par tous les sommets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est un cycle hamiltonien, pas un<br/>
arbre couvrant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un sous-graphe qui contient tous les sommets et forme un arbre (connexe, sans cycle)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un arbre couvrant contient $n$<br/>
sommets et $n - 1$ arêtes choisies parmi celles<br/>
du graphe initial. Quand le graphe est pondéré,<br/>
on peut chercher l'arbre couvrant <strong>minimal</strong><br/>
(Kruskal, Prim) : minimise la somme des poids.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q25 : Choisir le bon algorithme</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Vous voulez calculer le chemin le plus court entre deux<br/>
villes sur un réseau routier (les routes ont des<br/>
longueurs en kilomètres positives). Quel algorithme<br/>
choisir ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Récapitulatif algorithmes plus courts chemins :<br/>
parcours en largeur (non pondéré), Dijkstra (poids positifs),<br/>
Bellman-Ford (poids négatifs sans cycle négatif),<br/>
Floyd-Warshall (toutes paires de sommets en<br/>
$O(n^3)$).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>parcours en profondeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : parcours en profondeur ne calcule pas les plus courts<br/>
chemins.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>parcours en largeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : parcours en largeur minimise le <strong>nombre d'arêtes</strong>, pas<br/>
la <strong>somme des poids</strong>. Le résultat ignorerait<br/>
les longueurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tri topologique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : utile pour les DAG, pas pour les<br/>
plus courts chemins en général.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>L'algorithme de Dijkstra (les poids sont positifs)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Dijkstra est exactement conçu<br/>
pour ce cas. Pour des graphes très grands, on<br/>
utilise des variantes optimisées (A*, Dijkstra<br/>
bidirectionnel, contractions).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q26 : Conversion entre représentations</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Soit le graphe non orienté représenté par la<br/>
liste d'adjacence<br/>
<code>g = {'A': ['B', 'C'], 'B': ['A', 'C'], 'C': ['A', 'B']}</code>.<br/>
Quelle est la matrice d'adjacence correspondante<br/>
avec l'ordre des sommets <code>[A, B, C]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour un graphe non orienté, la matrice<br/>
d'adjacence est toujours <strong>symétrique</strong>. Pour un<br/>
graphe orienté, ce n'est pas nécessairement le<br/>
cas. Les deux représentations sont équivalentes<br/>
en information ; le choix dépend des opérations<br/>
les plus fréquentes (test d'arête en O(1) avec<br/>
la matrice ; énumération des voisins efficace<br/>
avec la liste).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>[[0, 1, 0],
 [1, 0, 1],
 [0, 1, 0]]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette matrice correspondrait à un<br/>
graphe en chaîne <code>A - B - C</code>, où <code>A</code> et <code>C</code><br/>
ne sont pas directement reliés. Or le graphe<br/>
donné est complet : <code>A</code> et <code>C</code> sont voisins.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>[[0, 1, 1],
 [1, 0, 1],
 [1, 1, 0]]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : chaque sommet est relié à<br/>
chacun des deux autres (graphe complet $K_3$).<br/>
La diagonale est nulle (pas de boucle), et la<br/>
matrice est symétrique (graphe non orienté).<br/>
Toutes les autres cases valent $1$ car les<br/>
arêtes existent dans tous les sens.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait un graphe sans aucune<br/>
arête. Or le graphe possède bien des arêtes<br/>
(chaque sommet a des voisins dans la liste<br/>
d'adjacence).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>[[1, 1, 1],
 [1, 1, 1],
 [1, 1, 1]]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la diagonale ne doit pas être à $1$<br/>
car aucun sommet n'a de boucle sur lui-même<br/>
(par exemple, <code>g['A']</code> ne contient pas <code>'A'</code>).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q27 : Théorème des poignées de mains</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans un graphe <strong>non orienté</strong>, quelle relation<br/>
relie la somme $S$ des degrés de tous les<br/>
sommets et le nombre $m$ d'arêtes ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Conséquence amusante : dans un groupe de<br/>
personnes, le nombre de personnes ayant serré<br/>
la main à un nombre <strong>impair</strong> d'autres<br/>
personnes est forcément pair. C'est l'une des<br/>
premières applications de la théorie des<br/>
graphes (Euler, $1736$).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$S = n$ (nombre de sommets)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la somme des degrés dépend du<br/>
nombre d'<strong>arêtes</strong>, pas du nombre de<br/>
sommets. Un graphe avec beaucoup de sommets<br/>
mais peu d'arêtes a une somme des degrés<br/>
faible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$S = m$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : oublie le double comptage. Chaque<br/>
arête participe à <strong>deux</strong> degrés (un par<br/>
extrémité), pas un seul.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$S = m^2$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune raison d'avoir une relation<br/>
quadratique. La relation est linéaire : $S$<br/>
dépend de $m$ par un facteur multiplicatif<br/>
de $2$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$S = 2m$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est le théorème des poignées<br/>
de mains. Chaque arête contribue $1$ au degré<br/>
de chacun de ses deux extrémités, donc compte<br/>
deux fois dans la somme des degrés. D'où<br/>
$S = 2m$. Conséquence directe : la somme des<br/>
degrés est toujours <strong>paire</strong>, et le nombre<br/>
de sommets de degré impair est aussi <strong>pair</strong>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q28 : Trace d'un parcours en largeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On effectue un parcours en largeur du graphe<br/>
<code>g = {'A': ['B', 'C'], 'B': ['A', 'D'], 'C': ['A', 'D'], 'D': ['B', 'C', 'E'], 'E': ['D']}</code><br/>
en partant de <code>'A'</code>, en visitant les voisins<br/>
dans l'ordre où ils apparaissent dans la liste.<br/>
Dans quel ordre les sommets sont-ils visités ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le parcours en largeur visite les sommets dans<br/>
l'ordre croissant de leur distance (en arêtes)<br/>
au sommet de départ. Niveau $0$ : $A$. Niveau<br/>
$1$ : $B$, $C$. Niveau $2$ : $D$. Niveau $3$ :<br/>
$E$. C'est exactement ce qui justifie l'usage<br/>
du parcours en largeur pour calculer les plus<br/>
courts chemins en nombre d'arêtes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>A, B, C, D, E</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on commence par enfiler <code>A</code>,<br/>
puis on défile <code>A</code> et on enfile ses voisins<br/>
<code>B</code> et <code>C</code>. On défile <code>B</code>, on enfile <code>D</code><br/>
(<code>A</code> est déjà visité). On défile <code>C</code> (ses<br/>
voisins <code>A</code> et <code>D</code> sont déjà visités ou<br/>
enfilés). On défile <code>D</code>, on enfile <code>E</code>. On<br/>
défile <code>E</code>. Ordre de visite : A, B, C, D, E.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>A, B, D, E, C</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est un parcours en <strong>profondeur</strong><br/>
(qui suit une branche en suivant les<br/>
voisins). Le parcours en largeur, lui,<br/>
visite les sommets par niveaux croissants<br/>
de distance, pas en plongeant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>A, C, B, D, E</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on visite les voisins dans l'ordre<br/>
où ils apparaissent dans la liste. Pour <code>A</code>,<br/>
c'est <code>B</code> puis <code>C</code>. Donc <code>B</code> est visité<br/>
avant <code>C</code>, pas l'inverse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>A, B, C, E, D</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on visite <code>D</code> avant <code>E</code> car <code>D</code> est<br/>
enfilé en premier (par <code>B</code>), et <code>E</code> n'est<br/>
enfilé que plus tard (quand on visite <code>D</code>).<br/>
L'ordre est donc D avant E.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q29 : Trace de l'algorithme de Dijkstra</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On considère le graphe pondéré suivant<br/>
(arêtes non orientées) :<br/>
<code>A-B (4)</code>, <code>A-C (2)</code>, <code>B-C (1)</code>, <code>B-D (5)</code>,<br/>
<code>C-D (8)</code>, <code>C-E (10)</code>, <code>D-E (2)</code>. On lance<br/>
Dijkstra depuis le sommet <code>A</code>. Quelle est la<br/>
distance minimale de <code>A</code> à <code>E</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Méthode systématique : tenir un tableau<br/>
<code>dist[v]</code> pour chaque sommet. Tant qu'il<br/>
reste des sommets non traités, extraire le<br/>
sommet de plus petite distance, et relâcher<br/>
(mettre à jour) ses voisins :<br/>
<code>dist[w] = min(dist[w], dist[v] + poids(v,w))</code>.<br/>
Cet algorithme est <strong>glouton</strong> : on traite<br/>
définitivement un sommet quand on l'extrait.<br/>
Cela exige des poids positifs ; sinon,<br/>
utiliser Bellman-Ford.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$14$ (en passant par <code>A-B-D-E</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce chemin pèse $4 + 5 + 2 = 11$,<br/>
pas $14$. Et il n'est pas optimal :<br/>
passer d'abord par <code>C</code> permet d'atteindre<br/>
<code>B</code> à coût $3$ (au lieu de $4$), ce qui<br/>
réduit ensuite le chemin total.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$12$ (en passant directement par <code>C-E</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est une distance valide<br/>
(chemin <code>A → C → E</code>), mais ce n'est pas<br/>
la <strong>plus courte</strong>. Le chemin<br/>
<code>A → C → B → D → E</code> totalise<br/>
$2 + 1 + 5 + 2 = 10$, ce qui est moins.<br/>
Dijkstra trouve toujours le minimum.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$11$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun chemin de <code>A</code> à <code>E</code> n'a<br/>
ce poids. Refaire le calcul en<br/>
considérant les chemins possibles :<br/>
<code>A → C → E</code> pèse $12$, <code>A → B → D → E</code><br/>
pèse $4 + 5 + 2 = 11$, et<br/>
<code>A → C → B → D → E</code> pèse<br/>
$2 + 1 + 5 + 2 = 10$. C'est ce dernier<br/>
qui est minimal.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$10$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on trace les distances<br/>
successivement. Étape 1 : on extrait<br/>
<code>A</code> ($0$), on met à jour <code>B=4</code>, <code>C=2</code>.<br/>
Étape 2 : on extrait <code>C</code> (le plus<br/>
petit, $2$), on met à jour<br/>
<code>B = min(4, 2+1) = 3</code>, <code>D = 2+8 = 10</code>,<br/>
<code>E = 2+10 = 12</code>. Étape 3 : on extrait<br/>
<code>B</code> ($3$), on met à jour<br/>
<code>D = min(10, 3+5) = 8</code>. Étape 4 : on<br/>
extrait <code>D</code> ($8$), on met à jour<br/>
<code>E = min(12, 8+2) = 10</code>. Étape 5 : on<br/>
extrait <code>E</code> ($10$), parcours terminé.<br/>
Le chemin optimal est donc<br/>
<code>A → C → B → D → E</code> de poids total<br/>
$2 + 1 + 5 + 2 = 10$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q30 : Code du parcours en profondeur récursif</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code Python implémente correctement un<br/>
parcours en profondeur récursif d'un graphe <code>g</code><br/>
(dictionnaire d'adjacence) à partir d'un<br/>
sommet <code>depart</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour transformer ce parcours en profondeur<br/>
récursif en parcours en profondeur itératif<br/>
avec pile explicite, on remplace la<br/>
récursion par une pile que l'on dépile et<br/>
empile manuellement. Cela permet de mieux<br/>
contrôler la consommation de pile et<br/>
d'éviter <code>RecursionError</code> sur les très<br/>
grands graphes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def parcours_profondeur(g, depart, visites=None):
    if visites is None:
        visites = set()
    visites.add(depart)
    for voisin in g[depart]:
        if voisin not in visites:
            parcours_profondeur(g, voisin, visites)
    return visites</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on marque le sommet<br/>
courant, puis on appelle récursivement<br/>
la fonction sur chaque voisin non encore<br/>
visité. La récursivité utilise<br/>
implicitement la pile d'appels, ce qui<br/>
réalise naturellement le LIFO du<br/>
parcours en profondeur. L'astuce<br/>
<code>visites=None</code> puis création d'un<br/>
ensemble dans la fonction évite le piège<br/>
du paramètre par défaut mutable, qui<br/>
serait partagé entre les appels<br/>
successifs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def parcours_profondeur(g, depart):
    for voisin in g[depart]:
        parcours_profondeur(g, voisin)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune trace des sommets<br/>
visités. Sur un graphe avec un cycle, la<br/>
fonction boucle indéfiniment et finit<br/>
par lever <code>RecursionError</code>. La<br/>
mémorisation des sommets déjà visités<br/>
est essentielle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def parcours_profondeur(g, depart):
    return list(g[depart])</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce code retourne uniquement les<br/>
voisins directs du sommet de départ,<br/>
pas le parcours complet. Il manque la<br/>
descente récursive dans les voisins.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def parcours_profondeur(g, depart, visites={}):
    visites[depart] = True
    for voisin in g[depart]:
        if voisin not in visites:
            parcours_profondeur(g, voisin, visites)
    return visites</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Piège classique du paramètre par défaut<br/>
mutable : le dictionnaire <code>visites = {}</code><br/>
est créé <strong>une seule fois</strong>, à la<br/>
définition de la fonction. Tous les<br/>
appels successifs à<br/>
<code>parcours_profondeur(g, ...)</code> partagent<br/>
alors le même dictionnaire, ce qui<br/>
conduit à un bug subtil : un nouveau<br/>
parcours conserve les sommets visités<br/>
d'un parcours précédent.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q31 : Détection de cycle dans un graphe orienté</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment <strong>détecter la présence d'un cycle</strong><br/>
dans un graphe <strong>orienté</strong> à l'aide d'un<br/>
parcours en profondeur ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Application directe : un graphe orienté est<br/>
un <strong>DAG</strong> si et seulement s'il ne contient<br/>
aucun cycle. La détection de cycles est<br/>
donc l'algorithme préliminaire à tout tri<br/>
topologique. Sur un graphe <strong>non orienté</strong>,<br/>
la détection est plus simple : il suffit de<br/>
vérifier qu'au cours du parcours en<br/>
profondeur, on ne rencontre pas un voisin<br/>
déjà visité (autre que le parent immédiat).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>On marque chaque sommet avec trois états :<br/>
non visité, en cours de visite<br/>
(sur la pile d'appels actuelle), et<br/>
terminé. Si pendant le parcours, on<br/>
rencontre une arête vers un sommet « en<br/>
cours de visite », on a détecté un cycle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'algorithme<br/>
standard, dit des « trois couleurs »<br/>
(blanc, gris, noir). Le sommet « gris »<br/>
est en cours de visite : si on retombe<br/>
dessus, c'est qu'on a fait un cycle.<br/>
Sans la distinction « en cours / terminé »,<br/>
on confondrait un cycle avec une simple<br/>
réutilisation d'un sommet déjà exploré<br/>
dans une autre branche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On compte simplement le nombre d'arêtes :<br/>
s'il dépasse $n - 1$, il y a un cycle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette propriété est vraie pour<br/>
les graphes <strong>non orientés connexes</strong> (un<br/>
arbre couvrant a exactement $n - 1$<br/>
arêtes), mais pas pour les graphes<br/>
orientés en général. Un graphe orienté<br/>
peut avoir beaucoup plus d'arêtes sans<br/>
cycle (DAG dense).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il est impossible de détecter un cycle en<br/>
temps polynomial</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la détection de cycle se fait en<br/>
$O(n + m)$ avec un parcours en<br/>
profondeur. C'est l'un des algorithmes<br/>
les plus efficaces sur les graphes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On regarde si la matrice d'adjacence est<br/>
symétrique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la symétrie de la matrice<br/>
d'adjacence indique que le graphe est<br/>
<strong>non orienté</strong> (toute arête a son<br/>
retour), pas qu'il y a un cycle.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q32 : Algorithme de Kahn pour le tri topologique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le principe de l'<strong>algorithme de<br/>
Kahn</strong> pour calculer un tri topologique d'un<br/>
DAG ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Application : compilation d'un projet (les<br/>
modules dépendent les uns des autres),<br/>
ordonnancement de tâches (certaines<br/>
doivent précéder d'autres), résolution de<br/>
formules dans un tableur (l'ordre de<br/>
recalcul respecte les dépendances entre<br/>
cellules). Si le graphe contient un cycle,<br/>
l'algorithme de Kahn s'arrête prématurément<br/>
et révèle l'impossibilité d'un tri<br/>
topologique.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On effectue un parcours en largeur depuis<br/>
le premier sommet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le parcours en largeur<br/>
standard parcourt par distance, pas par<br/>
dépendances. Il existe une variante du<br/>
parcours en profondeur (post-ordre<br/>
inversé) qui donne aussi un tri<br/>
topologique, mais ce n'est pas l'idée<br/>
de Kahn.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On trie les sommets par ordre alphabétique<br/>
de leur identifiant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un tri alphabétique ne respecte<br/>
pas les dépendances. Le tri topologique<br/>
doit garantir que pour chaque arête<br/>
<code>u → v</code>, <code>u</code> apparaît avant <code>v</code> dans<br/>
l'ordre, ce que l'ordre alphabétique ne<br/>
fait absolument pas en général.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>On retire répétitivement les sommets de<br/>
degré entrant nul (qui ne dépendent<br/>
de rien) ; à chaque retrait, on les<br/>
ajoute à la liste de sortie et on<br/>
décrémente le degré entrant de leurs<br/>
voisins. On continue jusqu'à ce qu'il ne<br/>
reste plus aucun sommet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est un algorithme<br/>
glouton très intuitif. À chaque étape,<br/>
on traite un sommet « libre de toute<br/>
dépendance ». Si à un moment plus aucun<br/>
sommet n'est de degré entrant nul mais<br/>
qu'il en reste, c'est qu'il y a un<br/>
cycle (le graphe n'est pas un DAG).<br/>
Implémentation : maintenir une file (ou<br/>
ensemble) des sommets de degré entrant<br/>
nul, et la mettre à jour à chaque retrait.<br/>
Complexité : $O(n + m)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On calcule la matrice d'adjacence puis on<br/>
cherche les valeurs propres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport. Le calcul de<br/>
valeurs propres est une opération<br/>
d'algèbre linéaire, sans lien avec le<br/>
tri topologique des graphes.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
