Une arête s'écrit deux fois, et la boucle compte double
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 13 — Le modèle des graphes
Énoncé
On range un graphe non orienté en listes d'adjacence.
- Comment ajoute-t-on une arête ? Combien de cases occupe le graphe ?
- Un étudiant compte les arêtes en sommant les longueurs des listes. Que trouve-t-il ?
- Que vaut le degré d'un sommet portant une boucle ? Justifier par le lemme des poignées de main.
Corrigé
1. Une arête s'écrit deux fois : dans la liste de , et dans celle de .
/* Ajoute l'arête non orientée {u, v}. DEUX écritures pour UN lien. */
void ajouter_arete(int u, int v) {
assert(voisins[u][0] < DEG_MAX && voisins[v][0] < DEG_MAX);
voisins[u][0] = voisins[u][0] + 1; voisins[u][voisins[u][0]] = v;
voisins[v][0] = voisins[v][0] + 1; voisins[v][voisins[v][0]] = u;
}
La place occupée est donc , soit — la constante disparaît dans la notation, mais elle est bien là dans la mémoire, et elle compte quand on dimensionne un tableau.
La faute classique est d'oublier la seconde écriture. Le graphe reste utilisable : un parcours partant de trouve . Mais il n'est plus symétrique, et un parcours partant de ne trouve pas . On a écrit un graphe orienté en croyant écrire un graphe non orienté, et le défaut ne se révèle que sur certains sommets de départ — le pire genre de défaut.
2. Il trouve , et non . Mesuré sur le triangle : la somme des longueurs de listes vaut pour arêtes. C'est le lemme des poignées de main lu à l'envers : la longueur de la liste de est , et . Il faut diviser par deux — ou, si l'on préfère, ne compter que les couples avec .
3. Une boucle apporte au degré. C'est une convention, et le lemme des poignées de main est ce qui l'impose.
Prenons deux sommets et , l'arête et une boucle en : , donc doit valoir .
- Si la boucle comptait : , , somme . Le lemme tombe.
- Si elle compte : , , somme . Le lemme tient.
Vérifié par le calcul. La raison profonde est que la démonstration du lemme compte les extrémités d'arêtes : une arête en a deux, et celles d'une boucle sont toutes deux au même sommet.
Le piège de programmation qui en découle : dans une liste d'adjacence, une boucle en doit être écrite deux fois dans la liste de pour que sa longueur soit le degré. Presque personne ne le fait, et presque tous les programmes traitent la boucle comme un cas particulier — ce qui explique que le programme officiel écarte les multi-arcs et que beaucoup d'exercices supposent le graphe simple, c'est-à-dire sans boucle. Quand une convention coûte un cas particulier partout, on l'évite en interdisant l'objet, et c'est ce que fait ici la définition usuelle.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.