1 #include "galeshapley.h"
10 GaleShapley(size_type capacidad):
17 primera_ronda() // O(N^2.log(N))
19 for (personas_type::iterator ih = hombres.begin(); // O(N)
20 ih != hombres.end(); ++ih)
22 (*ih)->declarar_a(*((*ih)->prefs.front())); // O(1)
24 for (personas_type::iterator im = mujeres.begin(); // O(N)
25 im != mujeres.end(); ++im)
28 if (m.ofertas.empty()) // O(1)
30 m.ordenar_ofertas(); // O(N.log(N))
31 Persona& prometido = *(m.ofertas.front()); // O(1)
32 m.ofertas.pop_front(); // O(1)
33 m.comprometer_con(prometido); // O(N)
39 nesima_ronda() // O(N^2.log(N))
41 // Todo el for es O(N^2)
42 for (personas_type::iterator ih = hombres.begin(); // O(N)
43 ih != hombres.end(); ++ih)
46 if (h.estado == Persona::COMPROMETIDO)
50 for (personas_type::iterator im = h.prefs.begin(); // O(N)
51 im != h.prefs.end(); ++im)
55 if (h.rechazos[pm->nombre] != NULL) // O(1)
60 assert(h.rechazos[pm->nombre] == NULL);
61 h.declarar_a(*pm); // O(1)
64 // Todo el for es O(N^2.log(N))
65 for (personas_type::iterator im = mujeres.begin(); // O(N)
66 im != mujeres.end(); ++im)
69 if (m.ofertas.empty()) // O(1)
72 m.ordenar_ofertas(); // O(N.log(N))
73 Persona* ph = m.ofertas.front(); // O(1)
74 m.ofertas.pop_front(); // O(1)
75 if (m.estado == Persona::COMPROMETIDO)
77 if (m.cmp(*(m.pareja), *ph) < 0) // O(1)
79 // la oferta es mejor, rompemos el compromiso
80 m.comprometer_con(*ph); // O(N)
84 // estamos mejor con nuestra pareja actual, asi
85 // que no hacemos mas que rechazar a todos
86 // (incluyendo el mejor candidato)
87 for (Persona::ofertas_type::iterator i // O(N)
89 i != m.ofertas.end(); ++i)
90 (*i)->rechazos[(&m)->nombre] = &m;
92 ph->rechazos[(&m)->nombre] = &m;
93 m.ofertas.clear(); // O(N)
98 m.comprometer_con(*ph); // O(N)
105 todos_h_comprometidos() const // O(N)
107 // FIXME: podemos ver de poner esto adentro de nesima_ronda()
108 for (personas_type::const_iterator ih = hombres.begin(); // O(N)
109 ih != hombres.end(); ++ih)
110 if ((*ih)->estado != Persona::COMPROMETIDO)
118 casamentear() // O(N^3.log(N))
120 primera_ronda(); // O(N^2.log(N))
121 while (!todos_h_comprometidos()) // O(N)
122 nesima_ronda(); // O(N^2.log(N))