Cod sursa(job #2778265)

Utilizator BogdanRazvanBogdan Razvan BogdanRazvan Data 1 octombrie 2021 00:56:23
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

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

void usain_bolt()
{
    ios::sync_with_stdio(false);
    fin.tie(0);
}

const int N = 2e4 + 5;

vector < int > a[N];
int l[N], r[N];
bool f[N];

bool cuplaj(int k)
{
    if(f[k] == true) {
        return false;
    }
    f[k] = true;
    for(auto v : a[k]) {
        if(l[v] == 0) {
            l[v] = k;
            r[k] = v;
            return true;
        }
    }
    for(auto v : a[k]) {
        if(cuplaj(l[v]) == true) {
            r[k] = v;
            l[v] = k;
            return true;
        }
    }
    return false;
}

int main()
{
    usain_bolt();

    int n, m, q;

    fin >> n >> m >> q;
    for(; q; --q) {
        int x, y;

        fin >> x >> y;
        a[x].push_back(y + n);
    }
    bool ok = true;
    do {
        ok = false;
        memset(f, 0, sizeof(f));
        for(int i = 1; i <= n; ++i) {
            if(r[i] == 0) {
                ok |= cuplaj(i);
            }
        }
    }
    while(ok == true);
    int ans = 0;
    for(int i = 1; i <= n; ++i) {
        ans += (r[i] > 0);
    }
    fout << ans << "\n";
    for(int i = 1; i <= n; ++i) {
        if(r[i] > 0) {
            fout << i << " " << r[i] - n << "\n";
        }
    }
    return 0;
}