diff --git a/TODO.md b/TODO.md index 24cda77..2dc033e 100644 --- a/TODO.md +++ b/TODO.md @@ -29,7 +29,7 @@ TODO avant rendu : - [ ] `contains()` - [x] Surcharge : afficher toutes les tâches - [ ] `consult_tasks()` - - [ ] `topologicalSort()` + - [x] `topologicalSort()` #### ProtoProjet diff --git a/includes/Projet.hpp b/includes/Projet.hpp index a2bc7c9..bbdcfa1 100644 --- a/includes/Projet.hpp +++ b/includes/Projet.hpp @@ -3,15 +3,16 @@ #include "../includes/Tache.hpp" +#include + class Projet { - // Graphe acyclique - std::vector taches; - // Première tâche qui sera exécutée - const Tache debut; + Tache + // Première tâche qui sera exécutée + debut, - // Source du graphe aka la dernière à être exécutée - const Tache fin; + // Source du graphe aka la dernière à être exécutée + fin; friend std::ostream &operator<<(std::ostream &, const Projet &); @@ -22,6 +23,9 @@ protected: Projet(const Projet &); // copy constructor const Projet &operator=(const Projet &); // copy assignement + // Graphe acyclique + std::vector taches; + // Retourne une paire d'indentifiants de tâches au hasard const std::pair pick_two_random_tasks() const; @@ -33,7 +37,7 @@ protected: const std::vector consult_tasks() const; // Corrige les éventuelles anomalies du vector de tâches - void topologicalSort() const; + std::vector topologicalSort(); }; #endif diff --git a/includes/ProtoProjet.hpp b/includes/ProtoProjet.hpp index a54fc79..14400b9 100644 --- a/includes/ProtoProjet.hpp +++ b/includes/ProtoProjet.hpp @@ -15,10 +15,10 @@ public: const ProtoProjet &operator=(const ProtoProjet &); // copy assignement // Remet tous les marquages à leur valeur initiale - /* void cleanMarks(); + void cleanMarks(); // Insère une nouvelle tâche en la plaçant entre deux tâches au hasars - bool ajoute(std::string nom, int duree); */ + /* bool ajoute(std::string nom, int duree); */ }; #endif diff --git a/includes/Tache.hpp b/includes/Tache.hpp index 0261b98..a220bdd 100644 --- a/includes/Tache.hpp +++ b/includes/Tache.hpp @@ -34,6 +34,9 @@ class Tache final { void _copy(const Tache &); public: + // Vrai si la tâche à été visitée par le parcours en profondeur + bool visite; + Tache(const std::string, const int); // constructor virtual ~Tache(); // destructor @@ -51,6 +54,9 @@ public: // Calcule la durée totale max de réalisation d'une tâche et des dépendances int dureeParal() const; + + // Parcours en profondeur + void PP_postfixe(std::vector); }; #endif diff --git a/src/Projet.cpp b/src/Projet.cpp index c9920b3..e33ffb0 100644 --- a/src/Projet.cpp +++ b/src/Projet.cpp @@ -66,9 +66,18 @@ const Tache *Projet::contains(const std::string name) const { const std::vector Projet::consult_tasks() const { return taches; } -void Projet::topologicalSort() const { - // Recupere le calcul fait par PP_postfixe et construit son tri - // PP_postfixe(this->taches); +std::vector Projet::topologicalSort() { + // Construction de la pile + std::vector pile; + for (Tache *it : taches) { + if (!it->visite) { + it->PP_postfixe(pile); + } + } - return; + // Reverse de la pile + std::reverse(pile.begin(), pile.end()); + + // Renvoie la liste de tâches topologiquement triée + return pile; } diff --git a/src/ProtoProjet.cpp b/src/ProtoProjet.cpp index f5aeefd..c4b6692 100644 --- a/src/ProtoProjet.cpp +++ b/src/ProtoProjet.cpp @@ -14,12 +14,12 @@ const ProtoProjet &ProtoProjet::operator=(const ProtoProjet &src) { return *this; } -/* void ProtoProjet::cleanMarks(){ - for (auto t : this->getTaches()) { - t.second = false; - } +void ProtoProjet::cleanMarks() { + for (auto t : taches) { + t->visite = false; + } }; -bool ProtoProjet::ajoute(std::string nom, int duree) { +/* bool ProtoProjet::ajoute(std::string nom, int duree) { return false; } */ diff --git a/src/Tache.cpp b/src/Tache.cpp index 8b4d6dd..ee28b72 100644 --- a/src/Tache.cpp +++ b/src/Tache.cpp @@ -113,3 +113,15 @@ int Tache::dureeParal() const { // On ajoute la valeur max à notre durée totale return ret_value + max_duree; } + +void Tache::PP_postfixe(std::vector pile) { + visite = true; + for (Tache *it : dependances) { + if (!it->visite) { + it->PP_postfixe(pile); + } + } + + // Moment post-fix du parcours + pile.push_back(this); +}