Adloun

Corrigé Mines-Ponts 2025 Informatique II MPI — Section 2.2 (Q19 à Q25) : Échange d'arêtes entre arbres couvrants et stratégie de Positus

Sujet officiel du concours Mines-Ponts, session 2025, épreuve Informatique II MPI. Corrigé rédigé par Ibrahim Alame.

Sujet officiel (PDF, site du concours)

Énoncé

Un arbre couvrant de est un ensemble de arêtes sans cycle. On admet que est connexe, que l'ajout à d'une arête crée un unique cycle, noté , et que deux sommets sont reliés par un unique chemin simple d'arêtes de .

Q19. , arbres couvrants, : montrer qu'il existe tel que soit un arbre couvrant.

En C, un arbre couvrant est un tableau T de taille : T[0] vaut et, pour , T[u] est le parent de dans l'arbre enraciné en . Un arc est codé par :


struct pair {
    int first;
    int second;
};
typedef struct pair pair_t;

Q20. pair_t edge_find(int n, int * T, int * Tprime, pair_t alpha) : T et Tprime codent et , alpha est un arc de orienté des feuilles vers la racine ; renvoyer une arête telle que soit un arbre couvrant.
Q21. void edge_swap(int n, int * T, pair_t alpha, pair_t beta) : alpha est un arc de orienté vers la racine, et est un arbre couvrant ; transformer T en le codage de .

Désormais, Minus joue en premier. Pour contenant et , est le graphe induit, où . On note (resp. ) l'ensemble des arêtes marquées par Positus (resp. Minus) après ses premiers coups, et l'assertion : après coups, il existe et deux arbres couvrants , de tels que et .

Q22. est vraie et Minus marque une arête de : montrer que Positus peut marquer une arête rendant vraie.
Q23. Même question si Minus marque une arête qui n'est ni dans ni dans .
Q24. Montrer que si est vraie à un moment de la partie, Positus a une stratégie gagnante.
Q25. On suppose ; est augmenté de l'arête . Si est vraie pour , montrer que Positus a une stratégie gagnante sur en jouant en premier.

Corrigé

Deux faits sur les forêts.

(F1) Une forêt (graphe sans cycle) à sommets et arêtes a exactement composantes connexes : chacune est un arbre, et un arbre à sommets a arêtes ; on somme sur les composantes. (F2) Si est un arbre couvrant, et , alors est un arbre couvrant : il a arêtes, et un cycle de cet ensemble serait un cycle de ne contenant pas , donc distinct de l'unique cycle . Ces faits valent dans tout graphe connexe, en particulier dans .

Q19. est sans cycle, avec sommets et arêtes : d'après (F1), il a exactement deux composantes connexes, d'ensembles de sommets et , avec . Choisissons et . Comme est connexe, un chemin de relie à ; en le parcourant, on passe de à , donc l'une de ses arêtes, , a une extrémité dans et l'autre dans .

a arêtes (, car aucune arête de ne relie à ). Il est sans cycle : n'en a pas, donc un cycle de passerait par , et le reste de ce cycle serait un chemin de entre les extrémités de , qui sont dans deux composantes différentes : c'est impossible. est donc un arbre couvrant. (Si , on peut obtenir et .)

Ce que le correcteur attend : les deux composantes de et la connexité de ; le jury signale la confusion fréquente entre arbre couvrant et ensemble d'arêtes qui touche tous les sommets.

Q20. On traduit la preuve de Q19 avec la structure unir & trouver de Q4 et Q5. Les arêtes de sont les pour , et où . On calcule les deux composantes de , puis on cherche une arête de qui les relie.


pair_t edge_find(int n, int * T, int * Tprime, pair_t alpha) {
    assert(alpha.first != 0 && T[alpha.first] == alpha.second);
    int * A = malloc(n * sizeof(int));
    assert(A != NULL);
    for (int v = 0; v < n; v++) {
        A[v] = v;
    }
    /* classes = composantes connexes de T prive de alpha */
    for (int v = 1; v < n; v++) {
        if (v != alpha.first) {
            uf_unite(n, A, v, T[v]);
        }
    }
    /* premiere arete de T' qui relie les deux composantes */
    pair_t beta = {-1, -1};
    for (int v = 1; v < n && beta.first == -1; v++) {
        if (uf_find(n, A, v) != uf_find(n, A, Tprime[v])) {
            beta.first = v;
            beta.second = Tprime[v];
        }
    }
    free(A);
    assert(beta.first != -1);   /* garanti par Q19 */
    return beta;
}

Après la première boucle, deux sommets ont le même identifiant si et seulement s'ils sont reliés dans : il y a deux classes, et . La seconde boucle passe en revue les arêtes de et s'arrête sur la première dont les extrémités sont dans des classes différentes ; Q19 garantit qu'elle existe, et la preuve de Q19 montre qu'elle convient. Coût : unions et au plus recherches, chacune en où est la hauteur des arbres de la structure, soit au pire, avec l'union par rang. Exécution : sur couples tirés au hasard dans des graphes de à sommets, l'arête renvoyée est dans et est un arbre couvrant ; le tableau A est libéré (aucune fuite).

100 % gratuit

La suite du corrigé est sur Adloun

Le corrigé rédigé en entier, question par question, et le tuteur pour poser des questions sur ce sujet.

Voir le corrigé complet, gratuitement

Inscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.

Toutes les parties de l'épreuve

Corrigé complet gratuit →