Graphes, exercice réseau ferroviaire
D'après Informatique tronc commun - ITC - PSI, MP, PC p232-233
Auteur(s) : Janny Steeven, Cherrière Théodore, Redaud Jeanne, Shu-Quartier-dit-Maire Wenqi, édition Ellipses
Présentation⚓︎
Dans cet exercice, on s’inspirera de l’évolution du réseau ferroviaire dans onze villes de France (Paris, Lille, Strasbourg, Lyon, Tours, Rennes, Bordeaux, Marseille, Nice, Toulouse et Brest) afin de prendre en main la manipulation de graphes.
Remarque: Sur le graphisme ci-dessous, Nantes est notée \(x_7\) comme Bordeaux. Pour simplifier, Nantes ne pas utilisée dans notre implémentation du graphe, c'est pour cela que le graphe contient 11 villes et non pas 12.
Plus précisément, on s’intéresse a la création et manipulation de plans P définis comme un ensemble de n villes numérotées de 1 a n, et d’un ensemble de m lignes ferroviaires les reliant entre elles. On supposera que tous les trains circulent a double-sens.

Implémentation d'une matrice d'adjacence et d'un tableau plan⚓︎
Ce réseau peut être étudié en implémentant deux variables :
- la matrice d'adjacence (une des deux représentations classiques d'un graphe)
- et un tableau
plantel que :
le plan P sous forme d’une liste de listes plan contenant (n+ 1) sous-tableaux tels que :
-
plan[O]contient[n,m], un tableau a deux elements avec n le nombre de villes, et m le nombre dc routes; -
pour chaque ville \(x_i\),
plan[i]contient un tableau a n elements, dont 1e premier plan [i][0] correspond au nombre de villes voisines, et lesn — 1éléments suivants (non nécessairement remplis) contiennent les indices des villes adjacentes (dans un ordre arbitraire et sans redondance).
Pour 1e plan P1 , on aurait donc n = 11, m = 7, on peut dénnir la variable plan_P1 telle que
-
plan_P1 [O] = [11, 7], -
plan_P1[1]= [5, 2, 3, 4, 5, 6, None, None, None, None, None]puisque la ville 1 a 5 voisins sur les 11. -
plan_P1[2] = [1, 1, None, None, None, None, None, None, None, None, None]carla ville 2 n'est réliée qu'à la ville 1
Ainsi :
Questions⚓︎
Q1 Complète la fonction plan_from_matrice qui prend un argmument la matrice d'adjacence et retourne le plan décrit ci-dessus.
Q2 Réciproquement la fonction matrice_from_plan retourne la matrice d'adjacence à partir du plan.
Complète la fonction suivante
for voisin in plan[.....][1:]: et if voisin != None: peuvent être remplacées par une seule en utilisant le premier élément de la liste qui donne le nombre de voisin(s).
Donc par for voisin in plan[.....][1:(1+plan[indice_ville][0])]:
compositions de fonctions réciproques⚓︎
Les deux fonctions plan_from_matrice et matrice_from_plan étant réciproques, leur composée donne la fonction identité.
Nous pouvons le constater en évaluant plan_from_matrice(matrice_from_plan(plan_P1)) == plan_P1
Q3 Ecrire une fonction est_adjacent(plan: list, i: int, j: int) qui renvoie True si les villes i et jsont adjacentes, Falsesinon.
Q4 Complète la fonction parcours(plan, i)qui donne la liste des villes accessibles depuis la ville ì. Quel est le type de parcours utilisé ici : largeur ou profondeur ?
Q5 A partir de la fonction précédente, écrire une fonction existe_chemin(plan, i, j) qui renvoie True si il existe un trajet TGV entre la ville i et la ville j, False sinon.
Pour aller plus loin⚓︎
Re écrire la fonction parcours à l'aide du parcours en profondeur, et écrire une fonction trouve_chemin(plan, i, j) qui retourne le chemin le plus court pour aller de la ville i à la ville j.
# Tests(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)