Cod sursa(job #913219)

Utilizator lianaliana tucar liana Data 13 martie 2013 10:30:14
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 2005
#define inf 10
long i, n, m, nr1, nr2, a, b, inc, sf, el, nbf, nod, fmin, rez;
long cap[nmax][nmax], fl[nmax][nmax], co[nmax], viz[nmax], t[nmax];
vector <long> ma[nmax/2];
vector <long> ::iterator it;

void adauga()
{
    ma[a].push_back(b); ma[b].push_back(a);
    cap[a][b]=1;
}

void citire()
{
    scanf("%ld %ld %ld",&nr1,&nr2,&m);
    for (i=1;i<=m;i++)
    {
        scanf("%ld %ld",&a,&b);
        a=a+1;  b=nr1+b+1;  adauga();
    }
    for (i=1;i<=nr1;i++)
    {   a=1;    b=i+1;  adauga();   }
    for (i=1;i<=nr2;i++)
    {   a=nr1+i+1;  b=nr1+nr2+2;    adauga();   }
}

void bfs()
{
    co[1]=1;    inc=sf=1;   nbf++;  viz[1]=nbf;
    while (inc<=sf)
    {
        el=co[inc]; inc++;
        for (it=ma[el].begin();it!=ma[el].end();it++)
            if ((viz[*it]<nbf) && (fl[el][*it]<cap[el][*it]))
            {
                 viz[*it]=nbf;
                 co[++sf]=*it;
                 t[*it]=el;
            }
    }
}

void rezolvare()
{
    n=nr1+nr2+2;
    while (1)
    {
        bfs();
        if (viz[n]==nbf)
        {
            nod=n;
            while (nod>1)
            {
                fl[t[nod]][nod]++;  fl[nod][t[nod]]--;
                nod=t[nod];
            }
            rez++;
        }
        else
            break;
    }
}

void afisare()
{
    printf("%ld\n",rez);
    for (i=2;i<=nr1+1;i++)
        for (it=ma[i].begin();it!=ma[i].end();it++)
            if ((fl[i][*it]==1) && (*it>1))
                printf("%ld %ld\n",i-1,*it-1-nr1);
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    citire();
    rezolvare();
    afisare();
    return 0;
}