Cod sursa(job #2685494)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 17 decembrie 2020 09:23:14
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <vector>
#include <cstring>


using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");



int N, M, E, u, v;
int L[10003], R[10003];

vector<int> G[10003];
bool sel[10003];

bool cuplaj(int nod) {
    sel[nod] = true;

    for (auto i : G[nod])
        if (!R[i]) {
            L[nod] = i;
            R[i] = nod;
            return true;
        }

    for (auto i : G[nod])
        if (!sel[R[i]] && cuplaj(R[i])) {
            L[nod] = i;
            R[i] = nod;
            return true;
        }

    return false;
}

int cuplaj() {
    bool can = true;
    while (can) {
        can = false;

        memset(sel, false, sizeof(sel));
        for (int i = 1; i <= N; i++)
            if (!L[i] && !sel[i])
                can |= cuplaj(i);
    }
    int nr = 0;


    for (int i = 1; i <= N; i++)
        nr += (L[i] != 0);

    return nr;
}
int main() {
    f >> N >> M >> E;
    for (int i = 1; i <= E; i++) {
        f >> u >> v;
        G[u].push_back(v);
    }
    g << cuplaj() << "\n";
    for (int i = 1; i <= N; i++)
        if (L[i]) {
            g << i << " " << L[i] << "\n";
        }
    return 0;
}