topologicalSort
This commit is contained in:
parent
3232e8ea7f
commit
428d594e7b
7 changed files with 50 additions and 19 deletions
2
TODO.md
2
TODO.md
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
std::vector<Tache *> Projet::topologicalSort() {
|
||||
// Construction de la pile
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
} */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Reference in a new issue