Cod sursa(job #2959940)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 3 ianuarie 2023 10:20:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;

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

const int NMAX = 1e4 + 1;

vector<int> vecini[NMAX];

int st[NMAX],dr[NMAX];

bitset<NMAX> viz;

bool pairup(int nod)
{
    if(viz[nod])
        return 0;

    viz[nod] = 1;
    for(auto it : vecini[nod])///incerc sa gasesc un nod liber
        {
            if(!dr[it])
                {
                    st[nod] = it;
                    dr[it] = nod;
                    return 1;
                }
        }

    for(auto it : vecini[nod])///incerc sa gasesc un lant alternant
        {
            if(pairup(dr[it]))
                {
                    st[nod] = it;
                    dr[it] = nod;
                    return 1;
                }
        }

    return 0;
}

int main()
{
    int n,m,l,a,b; fin >> n >> m >> l;
    while(l--)
        {
            fin >> a >> b;
            vecini[a].emplace_back(b);
        }

    for(;;)
        {
            bool semafor = false;
            viz.reset();

            for(int i = 1; i <= n ; i++)
                {
                    if(!st[i])
                        semafor |= pairup(i);
                }

            if(!semafor)
                break;
        }

    int ans = 0;
    for(int i = 1; i <= n ; i++)
        {
            if(st[i] > 0) ans++;
        }

    fout << ans << '\n';
    for(int i = 1; i <= n ; i++)
        {
            if(st[i] > 0)
                fout << i << " " << st[i] << '\n';
        }

    return 0;
}