Cod sursa(job #1443656)

Utilizator RaileanuCristian Raileanu Raileanu Data 28 mai 2015 13:27:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <list>
#include <string.h>

using namespace std;
ifstream f1("cuplaj.in");
ofstream f2("cuplaj.out");
#define NMAX 10005
#define NIL 0
#define INF 0x0fffffff
#define FOR_LI(it,G) for(list<int>::iterator it=G.begin(); it != G.end(); it++)

list<int> Graf[NMAX];

int l[NMAX], r[NMAX], u[NMAX], cuplaj;

int pairup(int nod)
{
    if ( u[nod] )
        return 0;

    u[nod]= 1;

    FOR_LI(i, Graf[nod])
        if ( !r[*i] )
        {
            l[nod]= *i;
            r[*i]= nod;
            return 1;
        }

    FOR_LI(i, Graf[nod])
        if ( pairup(r[*i]) )
        {
            l[nod]= *i;
            r[*i]= nod;
            return 1;
        }

    return 0;
}

void HopcropfKarp(int n)
{
    int change= 1, i;

    while (change)
    {
        change= 0;
        memset(u, 0, sizeof(u));
        for (i=1; i<=n; i++)
            if ( !l[i] )
                change |= pairup(i);
    }
    cuplaj= 0;
    for (i=1; i<=n; i++)
        if ( l[i] > 0 )
            cuplaj++;
}

int main()
{
    int n, m, e, i, x, y;

    f1>>n>>m>>e;

    for (i=1; i<=e; i++)
    {
        f1>>x>>y;
        Graf[x].push_back(y);
    }

    HopcropfKarp(n);

    f2<<cuplaj<<"\n";

    for (i=1; i<=n; i++)
        if ( l[i] > 0 )
            f2<<i<<" "<<l[i]<<"\n";

    f2.close();
    return 0;
}