Cod sursa(job #2637543)

Utilizator k2e0e0w3qDumitrescu Gheorghe k2e0e0w3q Data 23 iulie 2020 15:21:16
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 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);
    }

    int change = -1;
    while (change) {
        change = 0;
        u.fill(0);

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

    int ans = 0;
    for (i=1; i<=n; ++i)
        if (l[i])
            ++ans;

    fout << ans << '\n';
    for (i=1; i<=n; ++i)
        if (l[i])
            fout << i << ' ' << l[i] << '\n';
    return 0;
}