Cod sursa(job #1792495)

Utilizator Kira96Denis Mita Kira96 Data 30 octombrie 2016 15:28:15
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");

const int N = (1e5) + 10;
vector<int> v[N];
vector<pair<int,int>> sol;
bool viz[N];
int L[N], R[N], n, m, nrc, x, y;

bool cuplaj (int nod) {
    if (viz[nod]) {
        return false;
    }
    viz[nod] = true;
    for (auto &it : v[nod]) {
        if (!R[it]) {
            L[nod] = it;
            R[it] = nod;
            return true;
        }
    }

    for (auto &it : v[nod]) {
        if (cuplaj(R[it])) {
            L[nod] = it;
            R[it] = nod;
            return true;
        }
    }
    
    return false;
}
int main () {
    cin >> n >> m;
    for (int i = 1; i <= m; ++i) {
        cin >> x >> y;
        v[x].push_back(y);
    }
    bool ok = true;
    int nrc = 0;
    while (ok) {
        ok = false;
        memset(viz, 0, sizeof(viz));
        for (int i = 1; i <= n; ++i) {
            if (!L[i]) {
                if (cuplaj(i)) {
                    ++nrc;
                }
            }
        }
    }
    for (int i = 1; i <= n; ++i) {
        if (L[i]) {
            sol.push_back({i, L[i]});
        }
    }
    cout << sol.size() << "\n";
    for (int i = 0; i < sol.size(); ++i) {
        cout << sol[i].first << " " << sol[i].second << "\n";
    }
    return 0;
}