Cod sursa(job #2730192)

Utilizator savulescustefanSavulescu Stefan savulescustefan Data 25 martie 2021 22:00:12
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;
#define NMAX 10004
vector <int> v[NMAX];
bool ap[NMAX];
int le[NMAX], ri[NMAX];
inline int bipartiteMatching (int nod)
{
    if (ap[nod]) return 0;
    ap[nod] = true;
    for (auto &it : v[nod])
        if (!ri[it])
        {
            le[nod] = it;
            ri[it] = nod;
            return 1;
        }
    for (auto &it : v[nod])
        if (bipartiteMatching (ri[it]))
        {
            le[nod] = it;
            ri[it] = nod;
            return 1;
        }
    return 0;
}
int main ()
{
    freopen ("cuplaj.in","r",stdin);
    freopen ("cuplaj.out","w",stdout);
    int n, m, e;
    scanf ("%d %d %d", &n, &m, &e);
    for (; e; --e)
    {
        int x, y;
        scanf ("%d %d", &x, &y);
        v[x].push_back (y);
    }
    for (int mm = 1; mm;)
    {
        mm = 0;
        for (int i = 1; i <= n; ++i)
            ap[i] = false;
        for (int i = 1; i <= n; ++i)
            if (!le[i]) mm = max (mm, bipartiteMatching (i));
    }
    int nr = 0;
    for (int i = 1; i <= n; ++i)
        if (le[i]) ++nr;
    printf ("%d\n", nr);
    for (int i = 1; i <= n; ++i)
        if (le[i]) printf ("%d %d\n", i, le[i]);
    return 0;
}