Cod sursa(job #433831)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 4 aprilie 2010 15:02:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#define IN "cuplaj.in"
#define OUT "cuplaj.out"
#define L 10005

using namespace std;

struct nod
{
    int inf;
    nod *next;
}*V[L];

int S[L];
int D[L];
int viz[L];
int nrs, nrd, m;
int Rez;

void add(nod *&a,int i)
{
    nod *q=new nod;
    q->inf=i;
    q->next=a;
    a=q;
}

void citire()
{
    int a, b;
    scanf ("%d %d %d",&nrs, &nrd, &m);
    while (m--)
    {
        scanf ("%d %d",&a, &b);
        add(V[a], b);
    }
}

int ok(int P)
{
    if (viz[P])
        return 0;
    viz[P]=1;
    for (nod *i=V[P]; i; i=i->next)
        if (S[i->inf]==0 || ok(S[i->inf]))
        {
            D[P]=i->inf;
            S[i->inf]=P;
            return 1;
        }
    return 0;
}

void solve()
{
    int K=1;
    while (K)
    {
        K=0;
        for (int i=1;i<=nrs;i++)
            viz[i]=0;

        for (int i=1;i<=nrs;i++)
            if (!D[i])
                K+=ok(i);
        Rez+=K;
    }
}
void afisare()
{
    printf("%d\n",  Rez);
    for (int i=1;i<=nrs;i++)
        if (D[i])
            printf("%d %d\n", i, D[i]);

}

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