Cod sursa(job #3251244)

Utilizator matei8787Matei Dobrea matei8787 Data 25 octombrie 2024 15:10:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int b[10001], f[10001];
vector <int> gb[10001], gf[10001];
vector <int> viz(10001, 0);
bool cupleaza(int fata)
{
    if(viz[fata])
        return false;
    viz[fata] = 1;
    for(int vb : gf[fata])
    {
        if(!b[vb])
        {
            b[vb] = fata;
            f[fata] = vb;
            return true;
        }
    }
    for(int vb : gf[fata])
    {
        if(cupleaza(b[vb]))
        {
            b[vb] = fata;
            f[fata] = vb;
            return true;
        }  
    }
    return false;
}
int nfete, mbaieti, m; 
void cit()
{
    in >> nfete >> mbaieti >> m;
    for(int i = 1; i <= m; i++)
    {
        int x, y;
        in >> x >> y;
        gb[y].push_back(x);
        gf[x].push_back(y);
    }
}
int ans;
void rez()
{
    bool aux = true;
    while(aux)
    {
        aux = false;
        fill(viz.begin(), viz.end(), 0);
        for(int i = 1; i <= nfete; i++)
        {
            if(f[i] != 0)
            {
                continue;
            }
            if(cupleaza(i))
                aux = true;
        }
    }
    out << nfete - count(f + 1, f + nfete + 1, 0)<<'\n';
    for ( int i = 1 ; i <= nfete ; i++ )
    {
        if ( f[i] )
        {
            out<<i<<" "<<f[i]<<"\n";
        }
    }
}
int main()
{
    cit();
    rez();
    return 0;
}