<?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>Des sommets reliés par des arêtes</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>L'orienté a des arêtes à sens, pas le non orienté</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 toujours 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</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é, le poids d'une<br/>
route étant son temps de trajet. Les algorithmes de<br/>
recherche du chemin le plus court 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$ avec $M[i][j]=1$ si arête $i$-$j$</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 tous les degrés des sommets</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 du graphe entier</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 les voisins par niveaux successifs</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/>
(DFS), pas le parcours en largeur.</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 = 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 une branche à fond avant de revenir en arrière</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 sert par<br/>
exemple à repérer un cycle ou à chercher un chemin.</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, une liste peut servir de file :<br/>
<code>f = [depart]</code>, puis <code>f.append(v)</code> pour enfiler<br/>
à la fin et <code>f.pop(0)</code> pour défiler au début.<br/>
<code>pop(0)</code> décale tous les éléments restants ; une<br/>
file implémentée avec deux piles évite ce coût.</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 profondément 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 (ou 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>Le parcours en largeur traite les sommets par distance<br/>
croissante au départ : d'abord ceux à une arête, puis à<br/>
deux, et ainsi de suite. Dès qu'il atteint l'arrivée, le<br/>
nombre d'arêtes parcourues est donc minimal.</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 algorithme glouton qui va toujours vers le voisin le plus connecté</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un choix glouton fait à chaque étape ne<br/>
garantit pas le chemin le plus court : aller vers le<br/>
voisin qui a le plus de voisins peut éloigner de<br/>
l'arrivée.</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 : le parcours en profondeur ne donne pas le plus<br/>
court chemin en général. Il peut prendre une route longue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une recherche dichotomique dans la liste des sommets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la recherche dichotomique trouve une valeur<br/>
dans un tableau trié. Elle ne tient pas compte des<br/>
arêtes et ne construit aucun chemin.</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</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est aussi le nombre de ses voisins<br/>
dans un graphe simple. 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é 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 de ce sommet à la racine du graphe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il n'y a pas de racine dans un graphe<br/>
général, et une distance se mesure entre deux<br/>
sommets. Confusion avec les arbres.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sa profondeur dans un parcours en largeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la profondeur dépend du parcours choisi<br/>
et de son sommet de départ, alors que le degré<br/>
est une propriété du sommet lui-même.</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 seule arête répétée plusieurs fois de suite</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 au 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>Un chemin relie 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 possède au moins $n$ arêtes au total</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 — 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)$)</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 vraiment notable</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ù le parcours en largeur découvre un sommet,<br/>
il peut enregistrer (a) la distance, (b) le sommet<br/>
« parent » dans le parcours. 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 : le parcours en largeur ne visite que les<br/>
sommets 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. Le parcours en largeur<br/>
calcule 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 : le parcours en largeur calcule la distance<br/>
en <strong>nombre d'arêtes</strong>, sans tenir compte des poids<br/>
éventuels.</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 calcule le<br/>
parcours en largeur. Très utile dans des graphes où<br/>
toutes 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 limité à 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 codant le nombre total d'arêtes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un entier ne résume qu'une quantité. Il ne<br/>
dit pas quels sommets sont reliés entre eux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comme un tuple unique contenant tous les sommets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on saurait quels sommets existent, mais pas<br/>
lesquels sont voisins. Un tuple, immuable, ne permet<br/>
pas non plus d'ajouter une arête.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comme une chaîne de caractères énumérant les arêtes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il faudrait analyser le texte à chaque<br/>
accès aux voisins. Difficile à manipuler et<br/>
inefficace.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Comme un dictionnaire sommet vers liste de 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>La liste <code>visites</code> est cruciale : sans elle, 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 parcours_largeur(g, depart):
    visites = [depart]
    pile = [depart]
    while len(pile) &gt; 0:
        v = pile.pop()
        for w in g[v]:
            if w not in visites:
                visites.append(w)
                pile.append(w)
    return visites</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>pile.pop()</code> retire le <strong>dernier</strong><br/>
élément ajouté : la liste sert de pile (LIFO), et les<br/>
sommets ne sont plus traités par distance croissante au<br/>
départ. Le parcours en largeur exige une file (FIFO),<br/>
dont on retire le <strong>premier</strong> élément avec <code>pop(0)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def parcours_largeur(g, depart):
    visites = [depart]
    file = [depart]
    while len(file) &gt; 0:
        v = file.pop(0)
        for w in g[v]:
            if w not in visites:
                visites.append(w)
                file.append(w)
    return visites</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>file.pop(0)</code> retire le sommet ajouté<br/>
le plus tôt, ce qui impose le parcours en largeur. La<br/>
liste <code>visites</code> évite de réenfiler un sommet déjà<br/>
rencontré, donc de boucler sur un graphe avec cycle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def parcours_largeur(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 parcours_largeur(g, depart):
    file = [depart]
    resultat = []
    while len(file) &gt; 0:
        v = file.pop(0)
        resultat.append(v)
        for w in g[v]:
            file.append(w)
    return resultat</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans liste <code>visites</code>, chaque<br/>
sommet est réenfilé à chaque fois qu'on le<br/>
rencontre : sur un graphe avec cycle, la<br/>
boucle ne termine jamais. Le marquage des<br/>
sommets visités est indispensable.</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>Un graphe connexe 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>Un tableau linéaire à une dimension</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>Une file (premier entré, premier sorti)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une file est une structure linéaire,<br/>
sans branchement. File et arbre sont distincts.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une pile (dernier entré, premier sorti)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une pile est linéaire elle aussi. Pile<br/>
et arbre sont des structures totalement<br/>
différentes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q21 : Modéliser des conflits d'examens</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un lycée organise ses épreuves de rattrapage. Deux épreuves ne<br/>
peuvent pas avoir lieu en même temps si un élève doit passer les<br/>
deux. Pour préparer le planning, on veut représenter ces<br/>
incompatibilités par un graphe. Quelle modélisation convient ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour modéliser une situation par un graphe, on choisit les sommets<br/>
parmi les objets étudiés, ici les épreuves, et les arêtes selon la<br/>
relation qui les lie, ici avoir un élève en commun. Une relation<br/>
symétrique donne un graphe non orienté.</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 par élève, une arête entre deux élèves qui passent une même épreuve</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce graphe relie des élèves, alors que la contrainte porte<br/>
sur des épreuves. On ne pourrait pas y lire directement quelles<br/>
épreuves sont incompatibles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un sommet par épreuve, une arête entre deux épreuves qui ont un élève en commun</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les objets à placer sont les épreuves, et la<br/>
relation « ne pas avoir lieu en même temps » est symétrique, d'où un<br/>
graphe non orienté. Deux épreuves reliées par une arête devront<br/>
occuper des créneaux différents.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un sommet par épreuve, un arc d'une épreuve vers celle qui doit la suivre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'énoncé n'impose aucun ordre entre les épreuves, seulement<br/>
une incompatibilité. Cette relation est symétrique : un graphe<br/>
orienté ajouterait un sens qui n'existe pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un sommet par créneau horaire, une arête entre deux créneaux consécutifs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les créneaux sont ce que l'on cherche à attribuer, pas les<br/>
données du problème. Relier des créneaux consécutifs ne dit rien des<br/>
élèves communs aux épreuves.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q25 : Savoir si deux villes sont reliées</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur une carte, les routes entre villes portent des longueurs en<br/>
kilomètres. On veut seulement savoir s'il existe un chemin de la<br/>
ville <code>A</code> à la ville <code>B</code>, quelle que soit sa longueur. Quelle méthode<br/>
convient ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour savoir si deux sommets sont reliés, un parcours suffit : il<br/>
visite tous les sommets accessibles depuis le départ. Le choix entre<br/>
largeur et profondeur n'importe que si l'on veut, en plus, un chemin<br/>
au nombre d'arêtes minimal.</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>Seulement un parcours en largeur, le seul qui trouve des chemins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le parcours en largeur trouve les chemins au plus petit<br/>
nombre d'arêtes, mais la question ne porte que sur l'existence d'un<br/>
chemin. Le parcours en profondeur visite lui aussi tous les sommets<br/>
accessibles depuis <code>A</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Seulement un parcours en profondeur, qui suit chaque route jusqu'au bout</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le parcours en profondeur convient, mais il n'est pas le<br/>
seul. Tout parcours depuis <code>A</code> visite exactement les sommets<br/>
accessibles, et le parcours en largeur répond donc aussi.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>L'un ou l'autre parcours depuis <code>A</code>, en vérifiant si <code>B</code> est visité</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les deux parcours visitent tous les sommets<br/>
accessibles depuis <code>A</code>, dans des ordres différents. <code>B</code> est visité<br/>
si et seulement si un chemin mène de <code>A</code> à <code>B</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun parcours : il faut d'abord tenir compte des longueurs des routes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'existence d'un chemin ne dépend pas des longueurs,<br/>
seulement des routes présentes. Les longueurs ne servent que si l'on<br/>
cherche le chemin le plus court en kilomètres.</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 — 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 : Reconstituer un chemin grâce aux parents</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On considère le graphe <code>g</code> et la fonction suivants :</p>
<pre><code>g = {"A": ["B", "C"], "B": ["A", "D"], "C": ["A", "E"],
     "D": ["B", "E"], "E": ["C", "D"]}

def chemin(g, depart, arrivee):
    parent = {depart: depart}
    file = [depart]
    while len(file) &gt; 0:
        s = file.pop(0)
        for v in g[s]:
            if v not in parent:
                parent[v] = s
                file.append(v)
    resultat = [arrivee]
    s = arrivee
    while s != depart:
        s = parent[s]
        resultat.append(s)
    return resultat</code></pre>
<p>Que renvoie <code>chemin(g, "A", "E")</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pendant un parcours en largeur, noter pour chaque sommet celui qui<br/>
l'a découvert permet de reconstituer un chemin au nombre d'arêtes<br/>
minimal. La reconstruction part de l'arrivée et remonte les<br/>
parents : la liste obtenue suit l'ordre inverse du trajet.</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><code>['A', 'C', 'E']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le chemin passe bien par <code>C</code>, mais la fonction le construit<br/>
à reculons, en partant de <code>arrivee</code> et en remontant les parents. La<br/>
liste commence donc par <code>'E'</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>['E', 'C', 'A']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le parcours enregistre <code>'A'</code> comme parent de <code>'B'</code><br/>
et de <code>'C'</code>, puis <code>'B'</code> comme parent de <code>'D'</code> et <code>'C'</code> comme parent<br/>
de <code>'E'</code>, car <code>C</code> sort de la file avant <code>D</code>. En remontant depuis<br/>
<code>E</code>, on obtient <code>E</code>, <code>C</code>, puis <code>A</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>['E', 'D', 'B', 'A']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>E</code> est découvert depuis <code>C</code>, qui sort de la file avant<br/>
<code>D</code>. Son parent est donc <code>C</code> et non <code>D</code>, et le chemin reconstitué<br/>
ne passe pas par <code>B</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>['A', 'B', 'D', 'E']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce chemin compte trois arêtes alors que <code>A → C → E</code> n'en<br/>
compte que deux, et la fonction renvoie la liste en partant de<br/>
<code>arrivee</code>. Le parcours en largeur retient un chemin au nombre<br/>
d'arêtes minimal.</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 sommet<br/>
<code>depart</code>, appelé sous la forme<br/>
<code>parcours_profondeur(g, depart, [])</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un parcours en profondeur récursif marque le sommet<br/>
courant, puis se relance sur chaque voisin non visité en<br/>
partageant la même liste <code>visites</code>. Pour de très grands<br/>
graphes, on peut remplacer la récursion par une pile<br/>
explicite, ce qui évite <code>RecursionError</code>.</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):
    visites.append(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 courant en l'ajoutant<br/>
à <code>visites</code>, puis on appelle récursivement la fonction sur<br/>
chaque voisin non encore visité, en transmettant la même<br/>
liste. La récursivité utilise implicitement la pile<br/>
d'appels, ce qui réalise le LIFO du parcours en<br/>
profondeur. Sur le graphe<br/>
<code>g = {"A": ["B", "C"], "B": ["A", "D"], "C": ["A", "D"], "D": ["B", "C"]}</code>,<br/>
l'appel <code>parcours_profondeur(g, "A", [])</code> renvoie<br/>
<code>['A', 'B', 'D', 'C']</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def parcours_profondeur(g, depart, visites):
    visites.append(depart)
    for voisin in g[depart]:
        parcours_profondeur(g, voisin, visites)
    return visites</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun test avant l'appel récursif. Dans un graphe<br/>
non orienté, <code>B</code> est voisin de <code>A</code> et <code>A</code> voisin de <code>B</code> :<br/>
la fonction repasse sans fin par les mêmes sommets et<br/>
finit par lever <code>RecursionError</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def parcours_profondeur(g, depart, visites):
    visites.append(depart)
    for voisin in g[depart]:
        if voisin not in visites:
            parcours_profondeur(g, voisin, [])
    return visites</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'appel récursif transmet une nouvelle liste<br/>
vide au lieu de <code>visites</code>, donc chaque appel oublie les<br/>
sommets déjà vus. Dès qu'une arête peut être parcourue<br/>
dans les deux sens, la fonction repasse sans fin par les<br/>
mêmes sommets et l'appel finit sur <code>RecursionError</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def parcours_profondeur(g, depart, visites):
    visites.append(depart)
    for voisin in g[depart]:
        if voisin not in visites:
            return parcours_profondeur(g, voisin, visites)
    return visites</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le <code>return</code> placé dans la boucle arrête<br/>
l'exploration après le premier voisin non visité. Sur<br/>
<code>{"A": ["B", "C"], "B": ["A"], "C": ["A"]}</code>, l'appel<br/>
depuis <code>A</code> renvoie <code>['A', 'B']</code> et oublie <code>C</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q22 : Trace d'un parcours en profondeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On effectue un parcours en profondeur récursif depuis<br/>
le sommet $A$ sur le graphe non orienté suivant :</p>
<p>- $A$ est relié à $B$ et $C$ ;<br/>
- $B$ est relié à $D$ ;<br/>
- $C$ est relié à $D$ et $E$ ;<br/>
- $D$ est relié à $E$.</p>
<p>On suppose que, à chaque sommet visité, les voisins sont<br/>
examinés dans l'ordre alphabétique. Dans quel ordre les<br/>
sommets sont-ils découverts ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le parcours en profondeur (DFS) s'enfonce le long d'une<br/>
branche avant de revenir en arrière (pile ou récursion),<br/>
là où le parcours en largeur (file) progresse par<br/>
couches : sur ce même graphe, la largeur donnerait<br/>
$A, B, C, D, E$. Comparer les deux traces sur un même<br/>
graphe est le meilleur moyen de les distinguer.</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, D, C, E$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on s'enfonce d'abord. Depuis $A$,<br/>
on visite $B$ (premier voisin alphabétique), puis<br/>
$D$ (seul voisin non vu de $B$). Depuis $D$, les<br/>
voisins non vus sont $C$ et $E$ : l'alphabet impose<br/>
$C$, dont le seul voisin non vu est $E$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$A, B, C, D, E$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la trace du parcours en <strong>largeur</strong><br/>
(par couches : $B$ et $C$ voisins de $A$, puis $D$,<br/>
puis $E$). En profondeur, on descend via $B$ puis<br/>
$D$ avant de revenir à $C$.</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 : depuis $D$, les voisins non visités sont<br/>
$C$ et $E$ ; l'ordre alphabétique impose de<br/>
descendre par $C$ avant $E$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$A, C, D, B, E$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trace d'un parcours en profondeur qui<br/>
examinerait $C$ avant $B$ ; or l'ordre alphabétique<br/>
impose $B$ comme premier voisin de $A$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q23 : Choisir entre matrice et liste d'adjacence</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On souhaite stocker un graphe non orienté représentant<br/>
un réseau social : environ un million d'utilisateurs<br/>
(sommets) et en moyenne une centaine de contacts par<br/>
personne (graphe creux, environ $10^8$ arêtes au total).<br/>
Quelle représentation est la plus adaptée en pratique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle générale : pour un graphe <strong>dense</strong> (beaucoup<br/>
d'arêtes par rapport au carré du nombre de sommets),<br/>
la matrice d'adjacence est compétitive ; pour un<br/>
graphe <strong>creux</strong>, la liste d'adjacence l'emporte tant<br/>
en mémoire qu'en temps pour la plupart des<br/>
algorithmes (parcours, plus courts chemins).</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 liste d'adjacence, la matrice serait bien trop énorme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une matrice d'adjacence à $10^6$<br/>
sommets occupe $10^{12}$ cases, soit environ un<br/>
téraoctet pour un seul bit par case, ce qui est<br/>
inenvisageable. Une liste d'adjacence ne stocke que<br/>
les arêtes réellement présentes (environ $10^8$),<br/>
ce qui reste dans des ordres de grandeur<br/>
manipulables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une matrice d'adjacence, car elle permet de tester l'existence d'une arête en temps constant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le temps constant pour tester l'existence<br/>
d'une arête est un avantage théorique réel, mais la<br/>
taille de la matrice ($10^{12}$ cases) la rend<br/>
inutilisable sur un graphe d'un million de sommets.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une matrice d'adjacence, car elle est plus simple à implémenter et à comprendre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la simplicité d'implémentation ne compense<br/>
pas un coût mémoire prohibitif. Le critère décisif<br/>
dans ce scénario est la consommation mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune des deux représentations n'est utilisable à cette taille de graphe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la liste d'adjacence est exactement la<br/>
structure que tous les moteurs de réseaux sociaux<br/>
utilisent en pratique. Elle tient parfaitement en<br/>
mémoire pour un graphe creux à un million de<br/>
sommets.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q31 : Compter les arêtes dans une matrice d'adjacence</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La matrice d'adjacence d'un graphe non orienté à quatre sommets<br/>
contient $6$ coefficients égaux à $1$. Combien le graphe a-t-il<br/>
d'arêtes ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans un graphe non orienté, la somme des coefficients de la matrice<br/>
vaut deux fois le 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>$3$, chaque arête comptant deux fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une arête entre $i$ et $j$ met un $1$ en<br/>
position $(i, j)$ et un autre en $(j, i)$ ; $6 / 2 = 3$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$6$, un par coefficient égal à $1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la matrice est symétrique, chaque arête apparaît deux<br/>
fois.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$12$, deux par coefficient égal à $1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse, deux coefficients pour une arête.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$16$, un par coefficient de la matrice</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les coefficients nuls ne représentent aucune arête.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q32 : Une matrice d'adjacence symétrique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La matrice d'adjacence d'un graphe est symétrique, le coefficient<br/>
$(i, j)$ étant toujours égal au coefficient $(j, i)$. Que<br/>
traduit cette symétrie ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Orienté ou non, cela se lit sur la matrice : symétrique pour un<br/>
graphe non orienté, quelconque pour un graphe orienté.</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 graphe est non orienté, à arêtes à double sens</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si $i$ est relié à $j$, alors $j$ est relié à<br/>
$i$ ; c'est la définition d'une arête non orientée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le graphe est connexe, tous les sommets étant reliés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la symétrie ne dit rien sur l'existence de chemins<br/>
entre les sommets.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tous les sommets ont le même degré, le graphe étant régulier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la symétrie n'égalise pas les lignes entre elles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le graphe contient au moins un cycle passant par chaque sommet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un arbre a une matrice symétrique et aucun cycle.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q33 : Un coefficient sur la diagonale</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans une matrice d'adjacence, le coefficient $(2, 2)$ vaut $1$.<br/>
Que représente-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Ligne $i$, colonne $j$ : une arête de $i$ vers $j$. Sur la<br/>
diagonale, départ et arrivée coïncident.</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 boucle, arête du sommet $2$ vers lui-même</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la ligne et la colonne désignent le même<br/>
sommet ; l'arête part de $2$ et arrive en $2$. Un graphe simple<br/>
n'en contient pas, mais un graphe quelconque peut en avoir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, la diagonale étant forcément nulle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la diagonale est nulle dans un graphe simple, pas<br/>
dans un graphe quelconque.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un sommet isolé, sans aucun voisin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un sommet isolé a une ligne entièrement nulle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un sommet relié à tous les autres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait une ligne entière de $1$, hors diagonale.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q34 : Compter les arêtes dans une liste d'adjacence</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un graphe non orienté est représenté par ce dictionnaire des<br/>
voisins. Combien a-t-il d'arêtes ?<br/>
<pre><code>g = {"A": ["B", "C"], "B": ["A"], "C": ["A", "D"], "D": ["C"]}</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La somme des degrés d'un graphe non orienté vaut deux fois le<br/>
nombre d'arêtes, quelle que soit la représentation.</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>$3$, la moitié de la somme des longueurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les listes totalisent $6$ voisins, et chaque<br/>
arête figure dans la liste de ses deux extrémités, d'où<br/>
$6 / 2 = 3$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$6$, la somme des longueurs des listes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : chaque arête est comptée deux fois, une par extrémité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$4$, le nombre de listes, une par sommet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le nombre de clés est le nombre de sommets, pas<br/>
d'arêtes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$12$, deux par voisin mentionné dans une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse, deux mentions pour une arête.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q35 : Un arc dans une liste d'adjacence</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un graphe orienté possède un arc de <code>A</code> vers <code>B</code>, et aucun de <code>B</code><br/>
vers <code>A</code>. Où cet arc apparaît-il dans le dictionnaire des<br/>
successeurs ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans un graphe orienté, la liste d'adjacence d'un sommet est la<br/>
liste de ses successeurs : l'arc n'est écrit qu'au départ.</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 la liste de <code>A</code> seulement, qui contient <code>B</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la liste d'un sommet donne ses successeurs ;<br/>
<code>B</code> est successeur de <code>A</code>, mais <code>A</code> n'est pas successeur de<br/>
<code>B</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Dans les listes de <code>A</code> et de <code>B</code>, comme toute arête</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la double mention vaut pour les graphes non orientés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Dans la liste de <code>B</code> seulement, qui contient <code>A</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait un arc de <code>B</code> vers <code>A</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Dans une liste à part, les arcs ne se rangeant pas par sommet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la liste d'adjacence range bien les arcs par sommet<br/>
de départ.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q36 : Modéliser des tâches qui s'enchaînent</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un projet comporte des tâches dont certaines doivent être finies<br/>
avant que d'autres commencent. Quel graphe modélise ces<br/>
contraintes ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choisir orienté ou non revient à se demander si la relation a un<br/>
sens : « doit précéder » en a un.</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 graphe orienté, un arc allant d'une tâche à celle qui doit la suivre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la contrainte « avant » a un sens, l'arc aussi.<br/>
Un cycle dans ce graphe signalerait des contraintes<br/>
impossibles à satisfaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un graphe non orienté, l'ordre des tâches n'ayant pas d'importance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'ordre est précisément ce que l'on veut représenter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arbre binaire, chaque tâche ayant au plus deux suivantes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : rien ne limite le nombre de tâches suivantes ni<br/>
précédentes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une simple liste, les tâches s'exécutant toujours en séquence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : deux tâches sans contrainte entre elles peuvent être<br/>
menées en parallèle, une liste ne le dit pas.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q37 : Le nombre maximal d'arêtes d'un graphe simple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un graphe simple non orienté, sans boucle ni arête double, a<br/>
$5$ sommets. Combien d'arêtes peut-il avoir au maximum ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le graphe complet à $n$ sommets a $n(n-1)/2$ arêtes : c'est la<br/>
borne qui rend la matrice d'adjacence rentable quand le graphe est<br/>
dense.</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>$10$, une par paire de sommets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : chaque sommet peut être relié aux $4$<br/>
autres, et chaque arête relie deux sommets, d'où<br/>
$5 \times 4 / 2 = 10$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$5$, une par sommet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un sommet peut avoir bien plus d'une arête.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$25$, une par case de la matrice</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la diagonale est exclue et chaque arête occupe deux<br/>
cases.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$20$, une par couple ordonné</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'arête de $i$ à $j$ est la même que celle de $j$ à<br/>
$i$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q38 : Détecter un cycle pendant un parcours en profondeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lors d'un parcours en profondeur d'un graphe non orienté, à quel<br/>
signe reconnaît-on la présence d'un cycle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un parcours en profondeur construit un arbre ; toute arête qui<br/>
ramène vers un sommet déjà dans l'arbre, hors le parent, ferme un<br/>
cycle.</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 retombe sur un sommet déjà visité, autre que le précédent</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : il existe alors deux chemins distincts vers ce<br/>
sommet, celui du parcours et l'arête que l'on vient d'emprunter.<br/>
Le voisin d'où l'on vient est exclu, l'arête parcourue en sens<br/>
inverse ne formant pas un cycle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On revient au sommet de départ à la fin du parcours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tout parcours en profondeur revient au départ en<br/>
dépilant, cycle ou non.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On visite deux fois le même sommet, ce qui arrive dans tout graphe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un sommet marqué n'est jamais visité deux fois ; ce<br/>
qui compte, c'est de le rencontrer à nouveau.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On rencontre un sommet sans aucun voisin encore à visiter</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un sommet isolé n'appartient à aucun cycle.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Graphes — Q39 : Parcourir un graphe non connexe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un graphe non orienté a $10$ sommets, $8$ arêtes et $3$<br/>
composantes connexes. Combien de fois faut-il lancer un parcours<br/>
en largeur, depuis un sommet non encore visité, pour visiter tous<br/>
les sommets ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Relancer un parcours sur chaque sommet non visité est la méthode<br/>
standard pour compter les composantes connexes.</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>$3$ fois, une par composante</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un parcours atteint exactement la composante de<br/>
son sommet de départ ; il en faut un par composante, et compter<br/>
ces lancements compte les composantes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$1$ fois, un parcours atteignant tous les sommets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un parcours ne franchit pas les frontières entre<br/>
composantes, faute d'arête.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$10$ fois, une par sommet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les sommets déjà visités ne relancent rien.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$8$ fois, une par arête</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les arêtes sont suivies pendant le parcours, elles ne<br/>
le relancent pas.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
