Cod sursa(job #1853970)

Utilizator andreiudilaUdila Andrei andreiudila Data 22 ianuarie 2017 11:41:49
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");

struct celula{

int nod;
celula *next;
}*g[10001],*a,*p;

int n,m,x,y,cost,ok,sol,i,e;
bool viz[10001];
int l[10001],r[10001];

bool cupleaza(int nod)
{
    if(viz[nod]==1) return false;
    viz[nod]=1;

    for(celula *p=g[nod]; p; p=p->next )
    {
        if(l[p->nod]==0)
        {
            r[nod] = p->nod;
            l[p->nod] = nod;

            return true;
        }
    }

    for(celula *p=g[nod]; p; p=p->next )
    {
        if(cupleaza(l[p->nod]))
        {
            r[nod] = p->nod;
            l[p->nod] = nod;

            return true;
        }
    }

    return false;


}
int main()
{


    cin>>n>>m>>e;


    for(i=1;i<=e;++i)
    {

        cin>>x>>y;

        a=new celula;
        a->nod=y;
        a->next=g[x];
        g[x]=a;

    }

    ok=1;
    while(ok)
    {
        ok=0;
        memset(viz,0,sizeof(viz));

        for(i=1;i<=n;++i)
        {
            if(r[i]==0)
                ok = ok | cupleaza(i);
        }
    }


    for(i=1;i<=n;++i)
    {
        if(r[i]!=0) ++sol;
    }

    cout<<sol<<"\n";

    for(i=1;i<=n;++i)
    {
        if(r[i]!=0) cout<<i<<" "<<r[i]<<"\n";
    }

    return 0;
}