topologicalSort

This commit is contained in:
Mylloon 2023-10-27 21:40:27 +02:00
parent 3232e8ea7f
commit 428d594e7b
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
7 changed files with 50 additions and 19 deletions

View file

@ -29,7 +29,7 @@ TODO avant rendu :
- [ ] `contains()` - [ ] `contains()`
- [x] Surcharge : afficher toutes les tâches - [x] Surcharge : afficher toutes les tâches
- [ ] `consult_tasks()` <!-- faudrait testé si elles sont vraiment pas modifiable avant de cocher cette case --> - [ ] `consult_tasks()` <!-- faudrait testé si elles sont vraiment pas modifiable avant de cocher cette case -->
- [ ] `topologicalSort()` - [x] `topologicalSort()`
#### ProtoProjet #### ProtoProjet

View file

@ -3,15 +3,16 @@
#include "../includes/Tache.hpp" #include "../includes/Tache.hpp"
class Projet { #include <algorithm>
// Graphe acyclique
std::vector<Tache *> taches;
class Projet {
Tache
// Première tâche qui sera exécutée // Première tâche qui sera exécutée
const Tache debut; debut,
// Source du graphe aka la dernière à être exécutée // Source du graphe aka la dernière à être exécutée
const Tache fin; fin;
friend std::ostream &operator<<(std::ostream &, const Projet &); friend std::ostream &operator<<(std::ostream &, const Projet &);
@ -22,6 +23,9 @@ protected:
Projet(const Projet &); // copy constructor Projet(const Projet &); // copy constructor
const Projet &operator=(const Projet &); // copy assignement const Projet &operator=(const Projet &); // copy assignement
// Graphe acyclique
std::vector<Tache *> taches;
// Retourne une paire d'indentifiants de tâches au hasard // Retourne une paire d'indentifiants de tâches au hasard
const std::pair<const int, const int> pick_two_random_tasks() const; const std::pair<const int, const int> pick_two_random_tasks() const;
@ -33,7 +37,7 @@ protected:
const std::vector<Tache *> consult_tasks() const; const std::vector<Tache *> consult_tasks() const;
// Corrige les éventuelles anomalies du vector de tâches // Corrige les éventuelles anomalies du vector de tâches
void topologicalSort() const; std::vector<Tache *> topologicalSort();
}; };
#endif #endif

View file

@ -15,10 +15,10 @@ public:
const ProtoProjet &operator=(const ProtoProjet &); // copy assignement const ProtoProjet &operator=(const ProtoProjet &); // copy assignement
// Remet tous les marquages à leur valeur initiale // 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 // 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 #endif

View file

@ -34,6 +34,9 @@ class Tache final {
void _copy(const Tache &); void _copy(const Tache &);
public: public:
// Vrai si la tâche à été visitée par le parcours en profondeur
bool visite;
Tache(const std::string, const int); // constructor Tache(const std::string, const int); // constructor
virtual ~Tache(); // destructor 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 // Calcule la durée totale max de réalisation d'une tâche et des dépendances
int dureeParal() const; int dureeParal() const;
// Parcours en profondeur
void PP_postfixe(std::vector<Tache *>);
}; };
#endif #endif

View file

@ -66,9 +66,18 @@ const Tache *Projet::contains(const std::string name) const {
const std::vector<Tache *> Projet::consult_tasks() const { return taches; } const std::vector<Tache *> Projet::consult_tasks() const { return taches; }
void Projet::topologicalSort() const { std::vector<Tache *> Projet::topologicalSort() {
// Recupere le calcul fait par PP_postfixe et construit son tri // Construction de la pile
// PP_postfixe(this->taches); std::vector<Tache *> 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;
} }

View file

@ -14,12 +14,12 @@ const ProtoProjet &ProtoProjet::operator=(const ProtoProjet &src) {
return *this; return *this;
} }
/* void ProtoProjet::cleanMarks(){ void ProtoProjet::cleanMarks() {
for (auto t : this->getTaches()) { for (auto t : taches) {
t.second = false; t->visite = false;
} }
}; };
bool ProtoProjet::ajoute(std::string nom, int duree) { /* bool ProtoProjet::ajoute(std::string nom, int duree) {
return false; return false;
} */ } */

View file

@ -113,3 +113,15 @@ int Tache::dureeParal() const {
// On ajoute la valeur max à notre durée totale // On ajoute la valeur max à notre durée totale
return ret_value + max_duree; return ret_value + max_duree;
} }
void Tache::PP_postfixe(std::vector<Tache *> pile) {
visite = true;
for (Tache *it : dependances) {
if (!it->visite) {
it->PP_postfixe(pile);
}
}
// Moment post-fix du parcours
pile.push_back(this);
}