Cod sursa(job #2851573)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 18 februarie 2022 20:24:15
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;
class Matcher {
    int n, m;
    vector <int> l, r;
    vector <bool> upd;
    vector <vector <int>> g;
    inline bool pairup(int u) {
        if(upd[u]) return false;
        upd[u] = true;
        for(int v : g[u]) if(!l[v])
            return l[r[u] = v] = u;
        for(int v : g[u]) if(pairup(v))
            return l[r[u] = v] = u;
        return false;
    }
public:
    Matcher(int n, int m) : n(n), m(m), l(m + 1), r(n + 1), upd(n + 1), g(n + 1) {}
    void add_edge(int u, int v) { g[u].push_back(v); }
    vector <pair <int, int>> match() {
        for(bool ok = true; ok; ) {
            ok = false;
            fill(upd.begin(), upd.end(), false);
            for(int i = 1; i <= n; i++) if(!r[i])
                ok |= pairup(i);
        }
        vector <pair <int, int>> sol;
        for(int i = 1; i <= n; i++)
            if(l[r[i]] == i)
                sol.emplace_back(i, r[i]);
        return sol;
    }
};

int main()
{
    #ifndef HOME
    ifstream cin("cuplaj.in");
    ofstream cout("cuplaj.out");
    #endif // HOME
    int n, m, e, u, v;
    cin >> n >> m >> e;
    Matcher M(n, m);
    for(int i = 1; i <= e; i++)
        cin >> u >> v,
        M.add_edge(u, v);
    auto sol = M.match();
    cout << sol.size() << "\n";
    for(auto p : sol)
        cout << p.first << " " << p.second << "\n";
    return 0;
}