8 Persona(const std::string& nombre, sexo_type sexo, size_type cap):
9 nombre(nombre), prefs_hash(cap), estado(SOLTERO), sexo(sexo),
10 pareja(0), rechazos(cap)
14 /// Para representación
16 operator<< (std::ostream& os, const Persona::estado_type e)
20 case Persona::SOLTERO:
21 return os << "soltero";
22 case Persona::DECLARADO:
23 return os << "declarado";
24 case Persona::COMPROMETIDO:
25 return os << "comprometido";
27 assert("Estado de la persona desconocido");
28 return os << "desconocido";
32 /// Para representación
34 operator<< (std::ostream& os, const Persona::sexo_type s)
43 assert("Sexo de la persona desconocido");
44 return os << "desconocido";
48 /// Para representación
50 operator<< (std::ostream& os, const Persona& p)
52 std::string pareja = "-";
55 pareja = p.pareja->nombre;
57 os << "<" << p.nombre << " (" << p.sexo << "): " << p.estado << " - "
62 /// Función de comparación entre dos personas según nuestras preferencias
65 cmp(const Persona& p1, const Persona& p2) const // O(1)
67 int i1 = prefs_hash.get(p1.nombre); // O(1)
68 int i2 = prefs_hash.get(p2.nombre); // O(1)
77 // Para que no se exporte el símbolo, es de uso interno de este módulo
80 /// Functor de ordenamiento auxiliar
84 PersonaCmp(Persona& p): p(p) {}
85 /// devuelve true si p1 < p2
86 bool operator ()(const Persona* const p1, const Persona* const p2) const
88 return p.cmp(*p1, *p2) > 0; // O(1)
93 /// Inserta nueva oferta
96 push_oferta(Persona* p) // O(log(N))
98 heap_push(ofertas, p, PersonaCmp(*this));
101 /// Obtiene mejor oferta (sin eliminar)
104 top_oferta() const // O(1)
106 return ofertas.back();
109 /// Obtiene y elimina mejor oferta
112 pop_oferta() // O(log(N))
114 return heap_pop(ofertas, PersonaCmp(*this));
117 /// Nos declaramos a la persona p
120 declarar_a(Persona& p) // O(log(N))
124 p.push_oferta(this); // O(log(N))
127 /// Nos comprometemos con la persona p, quien se nos habia declarado previamente
130 comprometer_con(Persona& p) // O(N) ( es O(len(ofertas)) )
132 assert(p.estado == DECLARADO);
133 assert(p.pareja == this);
135 // rompemos el compromiso, si hay
136 if (estado == COMPROMETIDO)
139 pareja->estado = SOLTERO;
141 pareja->rechazos[this->nombre] = this; // O(1)
145 estado = COMPROMETIDO;
147 p.estado = COMPROMETIDO;
150 // si tenemos ofertas, las rechazamos
151 for (ofertas_type::iterator pretendiente = ofertas.begin(); // O(N)
152 pretendiente != ofertas.end(); ++pretendiente)
154 (*pretendiente)->rechazos[this->nombre] = this; // O(1)
156 ofertas.clear(); // O(N)
159 // Nos comprometemos con la otra persona y a ella la comprometemos con nosotros
162 comprometer_con_bt(Persona& p)
165 estado = COMPROMETIDO;
167 p.estado = COMPROMETIDO;
171 // Rompemos el compromiso existente
174 romper_compromiso(Persona& p)
176 assert(pareja == &p);
177 assert(p.pareja == this);
179 // rompemos el compromiso