target = tdatp2
-objetos = persona.o susanita.o galeshapley.o parser.o main.o
+objetos = persona.o hashtable.o susanita.o galeshapley.o backtracking.o parser.o main.o
all: $(target)
-persona.o: persona.cpp persona.h
+persona_h = persona.h
+persona.o: persona.cpp $(persona_h)
-susanita.o: susanita.cpp susanita.h persona.h
+hashtable_h = hashtable.h $(persona_h)
+hashtable.o: hashtable.cpp $(hashtable_h)
-galeshapley.o: galeshapley.cpp galeshapley.h susanita.h persona.h
+susanita_h = susanita.h $(hashtable_h)
+susanita.o: susanita.cpp $(susanita_h)
-parser.o: parser.cpp parser.h persona.h susanita.h
+galeshapley_h = galeshapley.h $(susanita_h)
+galeshapley.o: galeshapley.cpp $(galeshapley_h)
-main.o: main.cpp parser.h susanita.h galeshapley.h
+backtracking_h = backtracking.h $(susanita_h)
+backtracking.o: backtracking.cpp $(backtracking_h)
+
+parser_h = parser.h $(susanita_h)
+parser.o: parser.cpp $(parser_h)
+
+main.o: main.cpp $(parser_h) $(galeshapley_h) ${bactraking_h}
$(target): $(objetos)
$(CXX) $(LDFLAGS) $(objetos) $(LOADLIBES) $(LDLIBS) -o $(target)
+#include "backtracking.h"
#include "galeshapley.h"
#include "parser.h"
#include <iostream>
-int main(int argc, char* argv[])
+int
+main(int argc, char* argv[])
{
- if (argc != 2)
+ switch (argc)
{
- std::cerr << "Uso: " << argv[0] << " [archivo_entrada]\n";
- return 1;
- }
+ case 2: //Gale-Sharpley por default
+ {
+ // N * 2 para asegurar que el hash este ocupado al 50% y sea O(1)
+ GaleShapley gs(Parser::get_n(argv[1]) * 2);
+ Parser p(gs);
+
+ if (!p.input(argv[1]))
+ {
+ std::cerr << "Error al abrir el archivo '" << argv[1] << "'\n";
+ return 2;
+ }
+ gs.casamentear();
+ p.output();
+
+ break;
+ }
+ case 3: // BackTracking se especifica con tercer parámetro "-bt"
+ {
+ if (strcmp(argv[2], "-bt"))
+ {
+ std::cerr << "Uso: " << argv[0] << " archivo_entrada [-bt]\n";
+ return 1;
+ }
- GaleShapley gs;
- Parser p(gs);
+ // N * 2 para asegurar que el hash este ocupado al 50% y sea O(1)
+ BackTracking bt(Parser::get_n(argv[1]) * 2);
+ Parser p(bt);
- if (!p.input(argv[1]))
- {
- std::cerr << "Error al abrir el archivo '" << argv[1] << "'\n";
- return 2;
+ if (!p.input(argv[1]))
+ {
+ std::cerr << "Error al abrir el archivo '" << argv[1] << "'\n";
+ return 2;
+ }
+
+ bt.casamentear();
+
+ break;
+ }
+
+ default:
+ std::cerr << "Uso: " << argv[0] << " archivo_entrada [-bt]\n";
+ return 1;
}
- gs.casamentear();
- p.output();
+
+ // Todo OK
+ return 0;
+
}
ofertas.clear();
}
+// Nos comprometemos con la otra persona y a ella la comprometemos con nosotros
+void
+Persona::
+comprometer_con_bt(Persona& p)
+{
+ // nos comprometemos
+ estado = COMPROMETIDO;
+ pareja = &p;
+ p.estado = COMPROMETIDO;
+ p.pareja = this;
+}
+
+// Rompemos el compromiso existente
+void
+Persona::
+romper_compromiso(Persona& p)
+{
+ assert(pareja == &p);
+ assert(p.pareja == this);
+
+ // rompemos el compromiso
+ estado = SOLTERO;
+ pareja = 0;
+ p.estado = SOLTERO;
+ p.pareja = 0;
+}
+
+
/// Nos comprometemos con la persona p, quien se nos habia declarado
/// previamente
void comprometer_con(Persona& p);
-
+
+ // Nos comprometemos con la otra persona y a ella la comprometemos con nosotros
+ void comprometer_con_bt(Persona& p);
+
+ // Rompemos el compromiso
+ void romper_compromiso(Persona& p);
};
/// Para representación
#include "susanita.h"
#include <cassert>
#include <iostream>
+#include <algorithm>
-Susanita::~Susanita()
+Susanita::
+Susanita(size_type capacidad):
+ nombres(capacidad)
+{
+}
+
+// Uso interno
+namespace
+{
+ /// Mata a una persona
+ void matar(Persona* p)
+ {
+ delete p;
+ }
+}
+
+Susanita::
+~Susanita()
{
+ std::for_each(hombres.begin(), hombres.end(), matar);
+ std::for_each(mujeres.begin(), mujeres.end(), matar);
}
void
{
// XXX cual sería el problema que agregue una persona repetida?
// Reemplazaría a la anterior nomás
- assert(nombres.find(pp->nombre) == nombres.end());
+ assert(nombres[pp->nombre] == 0); // Muere si hay nombres repetidos
nombres[pp->nombre] = pp;
switch (pp->sexo)
Persona*
Susanita::
-get_persona(const std::string& nombre) const
+get_persona(const std::string& nombre)
{
- nombres_type::const_iterator ip = nombres.find(nombre);
- if (ip == nombres.end()) // No está
- return 0;
- return ip->second;
+ return nombres[nombre];
}
void
Susanita::
mostrar_estado(int mostrar_prios) const
{
+ personas_type::const_iterator ih;\r
std::cout << "Personas\n";
- for (personas_type::const_iterator ih = hombres.begin();
+ for (ih = hombres.begin();
ih != hombres.end(); ++ih)
std::cout << **ih << "\n";
std::cout << "\n";
return;
std::cout << "Prioridades\n";
- for (personas_type::const_iterator ih = hombres.begin();
+ for (ih = hombres.begin();
ih != hombres.end(); ++ih) {
Persona& h = **ih;
std::cout << h << "\n";
}
}
std::cout << "\n";
- for (personas_type::const_iterator ih = mujeres.begin();
+ for (ih = mujeres.begin();
ih != mujeres.end(); ++ih) {
Persona& h = **ih;
std::cout << h << "\n";