Cod sursa(job #2603037)

Utilizator Chirac_MateiChiriac Matei Chirac_Matei Data 18 aprilie 2020 14:24:49
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

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

int n,m,nrleg,x,y,cnt,ans,i;
bool viz[10005];
int rpair[10005];
int lpair[10005];
vector <int> nod[10005];

bool tryCouple(int poz)
{
    viz[poz]=true;
    int avoid = rpair[poz];

    for(int it : nod[poz])
    {
        if(it!=avoid && !lpair[it])
        {
            rpair[poz]=it;
            lpair[it]=poz;
            return true;
        }
    }

    for(int it : nod[poz])
    {
        if(it!=avoid)
        {
            if(viz[lpair[it]])
                continue;

            if(tryCouple(lpair[it]))
            {
                rpair[poz]=it;
                lpair[it]=poz;
                return true;
            }
        }
    }

    return false;
}
int main()
{
    fin>>n>>m>>nrleg;

    for(i=1;i<=nrleg;i++)
    {
        fin>>x>>y;
        nod[x].push_back(y);
    }

    while(true)
    {
        cnt=0;

        for(i=1;i<=n;i++)
            viz[i]=false;

        for(i=1;i<=n;i++)
        {
            if(!rpair[i])
            {
                if(tryCouple(i))
                    cnt++;
            }
        }

        if(!cnt)
            break;

        ans+=cnt;
    }

    fout<<ans<<'\n';

    for(i=1;i<=n;i++)
    {
        if(rpair[i])
            fout<<i<<' '<<rpair[i]<<'\n';
    }
    return 0;
}