Cod sursa(job #2134688)

Utilizator BlackNestaAndrei Manaila BlackNesta Data 18 februarie 2018 11:19:51
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

const int nMax= 10003;
int n, m, lf[nMax], rg[nMax], ans;
/**
*   lf[i] = nodul cu care se cupleaza nodul i din B
*   rg[i] = nodul cu care se cupleaza nodul i din A
*   ans = numarul de muchii din cuplajul maxim
*/
bool used[nMax];
/**
*   used[i] = 1 daca nodul i din lfanga e cuplat
*/
vector <int> L[nMax];

void Read() {
    int e, x, y;
    fin >> n >> m >> e;
    while (e--) {
        fin >> x >> y;
        L[x].push_back(y);
    }
}
/**
*   incerc sa cuplez nodul k
*   return 1 daca reusesc sau 0 daca nu
*/
bool Match(int k) {
    if (used[k]) return false;
    used[k] = 1;
    for (auto i : L[k]) {
        if (rg[i] == 0) {
            lf[k] = i;
            rg[i] = k;
            return true;
        }
    }
/**
*   n-am reusit sa-l cuplez pe k, deci mai parcurg o data L[k]
*   si poate reusesc sa-l cuplez pe k cu un nod cuplat
*/
    for (auto i : L[k]) {
        if (Match(rg[i])) {
            lf[k] = i;
            rg[i] = k;
            return true;
        }
    }
    return false;
}

void Solve() {
    int i;
    bool done = false;
    while (!done) {
        done = true;
        for (i = 1; i <= n; i++)
            used[i] = 0;
        for (i = 1; i <= n; i++) {
            if (lf[i] == 0 && Match(i)) {
                ans++;
                done = 0;
            }
        }
    }
    fout << ans << "\n";
    for (i = 1; i <= n; i++) {
        if(lf[i]) {
            fout << i << " " << lf[i] << "\n";
        }
    }
}

int main()  {
    Read();
    Solve();
    return 0;
}