Cod sursa(job #3155805)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 9 octombrie 2023 19:12:32
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int max_size = 1e4 + 1;

int l[max_size], r[max_size], viz[max_size];
vector <int> mc[max_size];

bool pairup (int nod)
{
    if (viz[nod] == 1)
    {
        return false;
    }
    viz[nod] = 1;
    for (auto f : mc[nod])
    {
        if (r[f] == 0)
        {
            l[nod] = f;
            r[f] = nod;
            return true;
        }
    }
    for (auto f : mc[nod])
    {
        if (pairup(r[f]))
        {
            l[nod] = f;
            r[f] = nod;
            return true;
        }
    }
    return false;
}

int main ()
{
    int st, dr, m;
    in >> st >> dr >> m;
    while (m--)
    {
        int x, y;
        in >> x >> y;
        mc[x].push_back(y);
    }
    while (1)
    {
        bool ok = false;
        for (int i = 1; i <= st; i++)
        {
            viz[i] = 0;
        }
        for (int i = 1; i <= st; i++)
        {
            if (l[i] == 0)
            {
                ok |= pairup(i);
            }
        }
        if (!ok)
        {
            break;
        }
    }
    int ans = 0;
    for (int i = 1; i <= st; i++)
    {
        if (l[i] != 0)
        {
            ans++;
        }
    }
    out << ans << '\n';
    for (int i = 1; i <= st; i++)
    {
        if (l[i] != 0)
        {
            out << i << " " << l[i] << '\n';
        }
    }
    in.close();
    out.close();
    return 0;
}