Cod sursa(job #1893419)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 25 februarie 2017 17:54:17
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <string.h>
#include <vector>

#define Ndim 10001

using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int L[Ndim],R[Ndim];
bool VIZ[Ndim];
vector <int> G[Ndim];
int pairup (int nod)
{
    if(VIZ[nod] == 1)
        return 0;
    VIZ[nod] = 1;
    for(vector <int> :: iterator it = G[nod].begin();it!=G[nod].end();++it)
    {
        if(R[*it] == 0)
        {
            L[nod] = *it;
            R[*it] = nod;
            return 1;
        }
    }
    for(vector <int> :: iterator it = G[nod].begin();it!=G[nod].end();++it)
    {
        if(pairup(R[*it]))
        {
            L[nod] = *it;
            R[*it] = nod;
            return 1;
        }
    }
    return 0;
}
int main()
{
    int i,n,m,e,change,sol = 0,a,b;
    fin>>n>>m>>e;
    for(i=1;i<=e;i++)
    {
        fin>>a>>b;
        G[a].push_back(b);
    }
    for(change = 1; change;)
    {
        change = 0;
        memset(VIZ,0,sizeof(VIZ));
        for(i=1;i<=n;i++)
        {
            if(!L[i])
                change |= pairup(i);
        }
    }
    for(i=1;i<=n;i++)
        if(L[i]!=0)
            sol++;
    fout<<sol<<'\n';
    for(i=1;i<=n;i++)
    {
        if(L[i]!=0)
            fout<<i<<' '<<L[i]<<'\n';
    }
    return 0;
}