// Otra idea que falla: tomar el primer par inestable y juntarlo, hasta que no quede ninguno.
#include <iostream>
#include <vector>

#include "matching.h"

int main() {
    Preferences students = {{0, 1, 2, 3}, {2, 3, 1, 0}, {0, 3, 1, 2}, {2, 0, 1, 3}};
    Preferences advisors = {{1, 3, 2, 0}, {3, 1, 0, 2}, {0, 2, 3, 1}, {0, 2, 1, 3}};
    std::vector<int> partner = {0, 1, 2, 3};
    std::vector<std::vector<int>> seen;
    while (std::find(seen.begin(), seen.end(), partner) == seen.end()) {
        seen.push_back(partner);
        for (int r : partner) {
            std::cout << 'a' << r << ' ';
        }
        auto unstable = find_unstable_pair(partner, students, advisors);
        if (!unstable) {
            std::cout << "estable\n";
            return 0;
        }
        std::cout << "par inestable: t" << unstable->first << " y a" << unstable->second << '\n';
        repair_pair(partner, unstable->first, unstable->second);
    }
    std::cout << "volvimos a:";
    for (int r : partner) {
        std::cout << " a" << r;
    }
    std::cout << "\nmatchings estables de esta instancia: " << all_stable_matchings(students, advisors).size() << '\n';
}
