Cod sursa(job #2637545)

Utilizator k2e0e0w3qDumitrescu Gheorghe k2e0e0w3q Data 23 iulie 2020 15:32:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>
#define N 10000
using namespace std;

vector <int> G[N+1];
array <int, N+1> u, l, r;
int pairup (int n) {
    if (u[n])
        return 0;
    u[n] = 1;
    for (auto it: G[n])
        if (!r[it]) {
            l[n] = it;
            r[it] = n;
            return 1;
        }

    for (auto it: G[n])
        if (pairup(r[it])) {
            l[n] = it;
            r[it] = n;
            return 1;
        }
    return 0;
}

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

    int n, m, ct;
    fin >> n >> m >> ct;

    int i, j;
    for (; ct; --ct) {
        fin >> i >> j;
        G[i].push_back(j);
    }

    bool changed = 1;
    while (changed) {
        changed = 0;
        u.fill(0);

        for (i=1; i<=n; ++i)
            if (!l[i])
                if (pairup(i))
                    changed = 1;
    }

    ct = 0;
    fout << "    \n";
    for (i=1; i<=n; ++i)
        if (l[i]) {
            ++ct;
            fout << i << ' ' << l[i] << '\n';
        }

    fout.seekp(0);
    fout << ct;
    return 0;
}