Cod sursa(job #414965)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 10 martie 2010 19:26:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#include <vector>
#define IN "cuplaj.in"
#define OUT "cuplaj.out"
#define Size 10010

using namespace std;

int S[Size],D[Size];
int viz[Size];
int nrS,nrD;
int M,ok,Numar;

vector <int> Nod[Size];

void citire()
{
    int s,d;
    scanf ("%d %d %d",&nrS,&nrD,&M);
    for (;M;M--)
    {
        scanf ("%d %d",&s,&d);
        Nod[s].push_back(d);
    }
}

int fiind(int ns)
{
    if (viz[ns])
        return 0;
    viz[ns]=1;
    for (int i=0;i<Nod[ns].size();i++)
        if (!S[Nod[ns][i]])
        {
            S[Nod[ns][i]]=ns;
            D[ns]=Nod[ns][i];
            return 1;
        }

    for (int i=0;i<Nod[ns].size();i++)
        if (S[Nod[ns][i]])
            if (fiind(S[Nod[ns][i]]))
            {
                S[Nod[ns][i]]=ns;
                D[ns]=Nod[ns][i];
                return 1;
            }
        return 0;
}

void solve()
{
    ok=1;
    while (ok)
    {
        for (int i=1;i<=nrS;i++)
            viz[i]=0;
        ok=0;
        for (int i=1;i<=nrS;i++)
            if (!D[i])
                ok+=fiind(i);
        Numar+=ok;
    }
}

void afish()
{
    printf("%d\n",Numar);
    for (int i=1;i<=nrS;i++)
        if (D[i])
            printf("%d %d\n",i,D[i]);
    printf("\n");
}

int main ()
{
    freopen (IN ,"r",stdin);
    freopen (OUT ,"w",stdout);
    citire();
    solve();
    afish();
    return 0;
}