Cod sursa(job #3040385)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 29 martie 2023 20:26:27
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int max_size = 1e4 + 1;

vector <int> mc[max_size];
int st[max_size], dr[max_size], uz[max_size];

bool pairup (int nod)
{
    if (uz[nod])
    {
        return false;
    }
    uz[nod] = 1;
    for (auto f : mc[nod])
    {
        if (!dr[f])
        {
            st[nod] = f;
            dr[f] = nod;
            return true;
        }
    }
    for (auto f : mc[nod])
    {
        if (pairup(dr[f]))
        {
            st[nod] = f;
            dr[f] = nod;
            return true;
        }
    }
    return false;
}

int main ()
{
    int l, r, m;
    in >> l >> r >> m;
    while (m--)
    {
        int x, y;
        in >> x >> y;
        mc[x].push_back(y);
    }
    while (1)
    {
        for (int i = 1; i <= l; i++)
        {
            uz[i] = 0;
        }
        bool ok = false;
        for (int i = 1; i <= l; i++)
        {
            if (!st[i])
            {
                ok |= pairup(i);
            }
        }
        if (!ok)
        {
            break;
        }
    }
    vector <pair <int, int>> rez;
    for (int i = 1; i <= l; i++)
    {
        if (st[i] > 0)
        {
            rez.push_back({i, st[i]});
        }
    }
    out << rez.size() << '\n';
    for (auto f : rez)
    {
        out << f.first << " " << f.second << '\n';
    }
    in.close();
    out.close();
    return 0;
}