DS MPSI - Réseau de dépôts - Gestion des liaisons et stocks

20 Mar 2026 20 Mar 2026 205 vues ESSADDOUKI Mostafa 6 min de lecture
Graphes Listes & Tuples Dictionnaires Débutant
4 parties
10 questions
Python
~50 min

Réseau de dépôts - Gestion des liaisons et stocks

On modélise un réseau de dépôts et de liaisons entre eux. Un réseau est représenté par un dictionnaire :

reseau = {
    1: [(2, 5), (3, 2)],
    2: [(1, 5), (3, 4), (4, 7)],
    3: [(1, 2), (2, 4), (4, 1)],
    4: [(2, 7), (3, 1)]
}
  • Les clés sont des entiers représentant les dépôts.
  • À chaque dépôt est associée une liste de tuples.
  • Chaque tuple (j, c) signifie qu'il existe une liaison vers le dépôt j de coût c.
1
Manipulation de listes et tuples 3 questions
Q1

Écrire une fonction voisins(reseau, i) qui retourne la liste des dépôts voisins de i.

Exemple

Entrée
voisins(reseau, 1)
Sortie
[2, 3]
Solution — Voisins
def voisins(reseau, i):
    if i not in reseau:
        return []
    
    liste_voisins = []
    for j, cout in reseau[i]:
        liste_voisins.append(j)
    
    return liste_voisins
Q2

Écrire une fonction cout_total_sortant(reseau, i) qui calcule la somme des coûts des liaisons sortant du dépôt i.

Exemple

Entrée
cout_total_sortant(reseau, 2)
Sortie
16
Explication : 5 + 4 + 7 = 16
Solution — Coût total sortant
def cout_total_sortant(reseau, i):
    if i not in reseau:
        return 0
    
    total = 0
    for j, cout in reseau[i]:
        total += cout
    
    return total
Q3

Écrire une fonction nombre_liaisons(reseau) qui retourne le nombre total de liaisons du réseau. (On suppose que le réseau est symétrique.)

Exemple

Entrée
nombre_liaisons(reseau)
Sortie
5
Solution — Nombre de liaisons
def nombre_liaisons(reseau):
    total = 0
    for i, liste_voisins in reseau.items():
        total += len(liste_voisins)
    
    # Le réseau est symétrique, chaque liaison est comptée deux fois
    return total // 2
2
Traitement avancé des structures 3 questions
Q4

Écrire une fonction depot_plus_connecte(reseau) qui retourne le dépôt ayant le plus grand nombre de voisins. En cas d'égalité, retourner le plus petit numéro.

Exemple

Entrée
depot_plus_connecte(reseau)
Sortie
2
Solution — Dépôt le plus connecté
def depot_plus_connecte(reseau):
    max_voisins = -1
    meilleur_depot = None
    
    for depot, liste_voisins in reseau.items():
        nb_voisins = len(liste_voisins)
        
        if nb_voisins > max_voisins:
            max_voisins = nb_voisins
            meilleur_depot = depot
        elif nb_voisins == max_voisins:
            if meilleur_depot is None or depot < meilleur_depot:
                meilleur_depot = depot
    
    return meilleur_depot
Q5

Écrire une fonction ajouter_liaison(reseau, i, j, c) qui ajoute une liaison bidirectionnelle entre i et j de coût c.

Solution — Ajouter une liaison
def ajouter_liaison(reseau, i, j, c):
    # Ajouter la liaison i -> j
    if i not in reseau:
        reseau[i] = []
    reseau[i].append((j, c))
    
    # Ajouter la liaison j -> i (bidirectionnelle)
    if j not in reseau:
        reseau[j] = []
    reseau[j].append((i, c))
    
    # Modification en place, pas de return
Q6

Écrire une fonction supprimer_liaison(reseau, i, j) qui supprime la liaison entre i et j.

Solution — Supprimer une liaison
def supprimer_liaison(reseau, i, j):
    # Supprimer la liaison i -> j
    if i in reseau:
        reseau[i] = [(voisin, cout) for voisin, cout in reseau[i] if voisin != j]
    
    # Supprimer la liaison j -> i
    if j in reseau:
        reseau[j] = [(voisin, cout) for voisin, cout in reseau[j] if voisin != i]
    
    # Modification en place, pas de return
3
Analyse des coûts 2 questions
Q7

Écrire une fonction cout_minimal_sortant(reseau, i) qui retourne le plus petit coût des liaisons sortant du dépôt i.

Exemple

Entrée
cout_minimal_sortant(reseau, 3)
Sortie
1
Solution — Coût minimal sortant
def cout_minimal_sortant(reseau, i):
    if i not in reseau or not reseau[i]:
        return None
    
    min_cout = float('inf')
    for j, cout in reseau[i]:
        if cout < min_cout:
            min_cout = cout
    
    return min_cout
Q8

On définit un dépôt comme central si la somme de ses coûts sortants est minimale. Écrire une fonction depot_central(reseau) qui retourne le dépôt central.

Exemple

Entrée
depot_central(reseau)
Sortie
3
Solution — Dépôt central
def depot_central(reseau):
    min_cout = float('inf')
    depot_min = None
    
    for depot in reseau:
        cout = cout_total_sortant(reseau, depot)
        
        if cout < min_cout:
            min_cout = cout
            depot_min = depot
        elif cout == min_cout:
            if depot_min is None or depot < depot_min:
                depot_min = depot
    
    return depot_min
4
Extension - Gestion des stocks 2 questions

On définit une structure secondaire :

stock = {
    1: [12, 7, 4],
    2: [5, 9],
    3: [3, 3, 8, 1],
    4: []
}

Chaque dépôt possède une liste de quantités.

Q9

Écrire une fonction total_stock(stock) qui retourne le stock total du réseau.

Exemple

Entrée
total_stock(stock)
Sortie
52
Solution — Stock total
def total_stock(stock):
    total = 0
    for depot, liste_quantites in stock.items():
        for quantite in liste_quantites:
            total += quantite
    return total
Q10

Écrire une fonction depot_max_stock(stock) qui retourne le dépôt ayant le plus grand stock total.

Exemple

Entrée
depot_max_stock(stock)
Sortie
1
Solution — Dépôt avec le plus grand stock
def depot_max_stock(stock):
    max_stock = -1
    meilleur_depot = None
    
    for depot, liste_quantites in stock.items():
        # Calculer le stock total du dépôt
        total = 0
        for quantite in liste_quantites:
            total += quantite
        
        if total > max_stock:
            max_stock = total
            meilleur_depot = depot
        elif total == max_stock:
            if meilleur_depot is None or depot < meilleur_depot:
                meilleur_depot = depot
    
    return meilleur_depot
Sortie
// La sortie apparaîtra ici…
Prêt · Ctrl+Entrée pour exécuter

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.