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()`
- [x] Surcharge : afficher toutes les tâches
- [ ] `consult_tasks()` <!-- faudrait testé si elles sont vraiment pas modifiable avant de cocher cette case -->
- [ ] `topologicalSort()`
- [x] `topologicalSort()`
#### ProtoProjet

View file

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

View file

@ -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

View file

@ -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<Tache *>);
};
#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; }
void Projet::topologicalSort() const {
// Recupere le calcul fait par PP_postfixe et construit son tri
// PP_postfixe(this->taches);
return;
std::vector<Tache *> Projet::topologicalSort() {
// Construction de la pile
std::vector<Tache *> pile;
for (Tache *it : taches) {
if (!it->visite) {
it->PP_postfixe(pile);
}
}
// 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;
}
/* 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;
} */

View file

@ -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<Tache *> pile) {
visite = true;
for (Tache *it : dependances) {
if (!it->visite) {
it->PP_postfixe(pile);
}
}
// Moment post-fix du parcours
pile.push_back(this);
}