Cod sursa(job #1935893)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 22 martie 2017 18:44:48
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <bitset>
using namespace std;
FILE *f=fopen("cuplaj.in","r");
FILE *g=fopen("cuplaj.out","w");
int T,N,M,E;
vector<int> G[10001];
int L[10001];
int R[10001];
bitset<10001> U;
int nr;
bool ok;
bool pairup(int x)
{
    if(U[x])
        return 0;
    U[x]=1;
    for(auto it:G[x])
    {
        if(!R[it]||pairup(R[it]))
        {
            R[it]=x;
            L[x]=it;
            return 1;
        }
    }
}
int main()
{
    ///fscanf(f,"%d",&T);
    T=1;
    while(T)
    {
        nr=0;
        memset(L,0,sizeof(L));
        memset(R,0,sizeof(R));
        fscanf(f,"%d%d%d",&N,&M,&E);
        for(int i=1;i<=N;i++) G[i].clear();
        for(int i=1;i<=E;i++)
        {
            int x,y;
            fscanf(f,"%d%d",&x,&y);
            G[x].push_back(y);
        }
        do
        {
            U.reset();
            ok=0;
            for(int i=1;i<=N;i++)
            {
                if(L[i]) continue;
                if(pairup(i))
                    ok=1,nr++;
            }
        }
        while(ok);
        fprintf(g,"%d\n",nr);
        for(int i=1;i<=N;i++)
            if(L[i])
                fprintf(g,"%d %d\n",i,L[i]);
        T--;
    }
    return 0;
}