Cod sursa(job #1822071)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 4 decembrie 2016 10:33:14
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
const int N=10010;
vector<int> v[N];
bool creste(int);
int n,m,q,i,j,ok,sol,S[N],D[N];
bitset<N> viz;
int main()
{
    f>>n>>m>>q;
    for(;q;q--)
    {
        f>>i>>j;
        v[i].push_back(j);
    }
    for(ok=1;ok;)
    {
        ok=0;
        viz.reset();
        for(i=1;i<=n;i++)
            if(!D[i]&&creste(i))
                sol++,ok=1;
    }
    g<<sol<<'\n';
    for(i=1;i<=n;i++)
        if(D[i])
            g<<i<<' '<<D[i]<<'\n';
    return 0;
}
bool creste(int i)
{
    if(viz[i])
        return 0;
    viz[i]=1;
    for(auto it:v[i])
        if(!S[it])
        {
            D[i]=it;
            S[it]=i;
            return 1;
        }
    for(auto it:v[i])
        if(!viz[S[it]]&&creste(S[it]))
        {
            D[i]=it;
            S[it]=i;
            return 1;
        }
    return 0;
}