Adloun

Probleme – Floyd-Warshall au-delà des distances

Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 19 — Parcours de graphes et plus courts chemins

Énoncé

Les trois boucles de Floyd-Warshall ne servent pas qu'aux distances.

Corrigé

1. La fermeture transitive. On remplace par : au lieu de « le plus court chemin », on calcule « existe-t-il un chemin ».


/* Remplace a par sa fermeture transitive et reflexive : apres l'appel,
   a[u][v] vaut true ssi il existe un chemin de u a v.
   Precondition : a[u][v] vaut true ssi l'arc u->v existe, et a[u][u] = true.
   Complexite : Theta(n^3) en temps, Theta(n^2) en memoire. */
void fermeture(bool a[][N_MAX], int n) {
    for (int k = 0; k < n; k = k + 1) {          /* k TOUJOURS a l'exterieur */
        for (int u = 0; u < n; u = u + 1) {
            for (int v = 0; v < n; v = v + 1) {
                if (a[u][k] && a[k][v]) { a[u][v] = true; }
            }
        }
    }
}

C'est l'algorithme de Warshall, antérieur à celui de Floyd, et c'est la même récurrence : « il existe un chemin de à par » se décompose en « il en existe un sans passer par » ou « il en existe un jusqu'à , puis un depuis ». On peut remplacer par n'importe quel semi-anneau : donne l'accessibilité, donne le chemin le plus large — celui dont l'arc le plus faible est le plus fort —, compte les chemins.

Mesure sur , , , , :


1 1 1 1 1        les sommets 0, 1, 2 forment un circuit : chacun
1 1 1 1 1        atteint les cinq sommets ; 3 n'atteint que 3 et 4 ;
1 1 1 1 1        4 n'atteint que lui-meme.
0 0 0 1 1
0 0 0 0 1

2. Excentricités, diamètre, rayon, centre. Une fois la matrice des distances calculée, tout se lit dessus :

et le centre est l'ensemble des sommets d'excentricité minimale. Mesure sur un graphe non orienté à six sommets, d'arêtes , , , , , , , , :


matrice des distances       excentricites : 13 10 11 8 10 13
   0   3   2   8  10  13    diametre = 13   (entre 0 et 5)
   3   0   1   5   7  10    rayon    =  8
   2   1   0   6   8  11    centre   = {3}
   8   5   6   0   2   5
  10   7   8   2   0   3
  13  10  11   5   3   0

Noter que mais alors que l'arête pèse : le plus court chemin de à passe par . La matrice initiale n'est pas la matrice finale, même sur les couples reliés par une arête.

Où c'est utile : le centre d'un réseau est l'endroit où placer un dépôt pour minimiser le pire trajet ; le diamètre mesure la « largeur » du réseau. Ces deux quantités demandent toutes les distances, donc Floyd-Warshall, et non Dijkstra — sauf sur un graphe très creux, où Dijkstra coûteraient , meilleur que dès que .

3. Les circuits négatifs. Après l'exécution, on lit la diagonale : signifie qu'il existe un chemin de à de poids négatif, c'est-à-dire un circuit absorbant passant par . Mesure sur (1), (), (), () :


diagonale : 0  -3  -3  -6      -> les sommets 1, 2 et 3 sont sur un circuit negatif

Le sommet garde : il n'est sur aucun circuit, même s'il en atteint un.

Deux précautions. D'abord, les valeurs hors diagonale n'ont plus de sens dès qu'un circuit négatif existe — comme pour Bellman-Ford, seul le drapeau se lit. Ensuite, avec des valeurs infinies représentées par un grand entier, déborde : on teste d[u][k] &lt; INF &amp;&amp; d[k][v] &lt; INF avant d'additionner, ou l'on prend des flottants, où est une valeur légitime. C'est le défaut du chapitre chap:langage-c qui ressurgit ici, dans un algorithme de quatre lignes.

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.