Partie I. Détection de cycles
Notations et définitions.
Le graphe orienté fini a pour ensemble de sommets .
Plusieurs arcs peuvent avoir la même source et la même cible, avec des étiquettes différentes.
Le dictionnaire Python G associe à chaque sommet la liste de ses successeurs.
L’indice d’un élément dans cette liste est l’étiquette de l’arc correspondant.
Les hypothèses générales sont les suivantes :
- A0 : les étiquettes des arcs sortant d’un sommet sont les entiers consécutifs commençant à zéro ;
- A1 : le graphe ne contient aucun cycle orienté.
Pour , la notation signifie qu’un chemin orienté relie à .
Le chemin de longueur nulle est autorisé, donc .
Les dictionnaires globaux époque et sortie associent un entier à chaque sommet.
Les variables globales présent et compteur sont des entiers.
Dans les formules, notons la valeur de présent, et les applications définies par les valeurs de époque et sortie :
Les invariants suivants sont disponibles hors de l’exécution de pp :
- A2 : pour tout , ;
- A3 : pour tout arc , ;
- A4 : pour tout arc ,
La fonction pp(s) effectue les opérations suivantes :
- elle affecte
présentàépoque[s]; - elle parcourt
G[s]dans l’ordre des indices et appelle récursivementpp(t)pour chaque successeur dont l’époque diffère deprésent; - après ce parcours, elle affecte
compteuràsortie[s], puis incrémentecompteur.
On admet la propriété de parcours en profondeur annoncée dans l’énoncé.
On utilise également, lorsqu’elle suffit, la préservation de A2, A3 et A4 par un appel complet à pp.
La fonction accessible(s, t) renvoie immédiatement False lorsque
ou lorsque les époques sont égales et .
Sinon, elle incrémente présent, exécute pp(s), puis renvoie le résultat du test époque[t] == présent.
La fonction lier(u, s) appelle accessible(s, u).
Si cet appel renvoie False, elle ajoute s à la liste G[u] et renvoie True.
Sinon, elle renvoie False sans ajouter d’arc.
Le graphe de l’exemple est défini par les listes suivantes :
G = {
'a': ['c', 'd'],
'b': ['d', 'c'],
'c': ['X', 'Y'],
'd': ['Y', 'X'],
'e': ['W', 'Z'],
'W': ['Z'],
'X': [],
'Y': [],
'Z': [],
}
Pour Q1, les valeurs initiales des deux dictionnaires sont toutes nulles, compteur vaut zéro et présent vaut un.
Les accès aux dictionnaires, les tests de présence dans un dictionnaire, les accès aux listes, len, append et pop ont les coûts constants admis par l’énoncé.
Q1.
Voir le corrigé
Déterminons les dictionnaires sortie et époque après l’appel pp('a') avec l’initialisation indiquée.
sortie = {
'a': 4,
'b': 0,
'c': 2,
'd': 3,
'e': 0,
'W': 0,
'X': 0,
'Y': 1,
'Z': 0,
}
époque = {
'a': 1,
'b': 0,
'c': 1,
'd': 1,
'e': 0,
'W': 0,
'X': 1,
'Y': 1,
'Z': 0,
}
Q2
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q3
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q4
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q5
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q6
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q7
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q8
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q9
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q10
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q11
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q12
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q13
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q14
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q15
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.
Q16
Voir le corrigé
Corrigé complet avec Sup et Spé+ : essai gratuit 7 jours.