// Dos matchings estables en la instancia cruzada: cuál sale depende de quién propone.
#include <iostream>

#include "instances.h"

namespace {

void print_pairs(const char* title, const std::vector<int>& partner) {
    std::cout << title;
    for (int t = 0; t < static_cast<int>(partner.size()); t++) {
        std::cout << " t" << t << "-a" << partner[t];
    }
    std::cout << '\n';
}

// Convierte "a qué tesista le toca cada asesor" en "a qué asesor le toca cada tesista".
std::vector<int> inverted(const std::vector<int>& partner) {
    std::vector<int> result(partner.size());
    for (int i = 0; i < static_cast<int>(partner.size()); i++) {
        result[partner[i]] = i;
    }
    return result;
}

void compare(const Preferences& students, const Preferences& advisors) {
    for (const std::vector<int>& stable : all_stable_matchings(students, advisors)) {
        print_pairs("  estable:", stable);
    }
    print_pairs("  proponen los tesistas:", gale_shapley(students, advisors).partner);
    print_pairs("  proponen los asesores:", inverted(gale_shapley(advisors, students).partner));
}

}  // namespace

int main() {
    std::cout << "instancia cruzada\n";
    compare(crossed_students(), crossed_advisors());
    std::cout << "ejemplo de cuatro\n";
    compare(example_students(), example_advisors());
}
