Cod sursa(job #1163232)

Utilizator lianaliana tucar liana Data 1 aprilie 2014 11:30:49
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#include<stdio.h>
#include<vector>
#include<map>
using namespace std;
#define nmax 10005
#define Nmax 2*nmax
#define inf 10
int n, m, nrm, S, D, a, b, i, nrbf, inc, sf, ntd, el, nod, fmin, rez, j ;
vector <int> ma[Nmax];
vector <int> ::iterator it;
int co[Nmax], viz[Nmax], t[Nmax], td[Nmax];
map <int, int> fl[Nmax], cap[Nmax];

void adauga(int x, int y)
{
    ma[x].push_back(y); cap[x][y]=1;
    ma[y].push_back(x);
}

void citire()
{
    scanf("%ld %ld %ld ",&n,&m,&nrm);
    for (i=1;i<=nrm;i++)
    {
        scanf("%ld %ld",&a,&b);
        adauga(a,b+n);
    }
    S=0;    D=n+m+1;
    for (i=1;i<=n;i++)
        adauga(S,i);
    for (i=1;i<=m;i++)
        adauga(i+n,D);
}

void bfs()
{
    nrbf++; inc=sf=1;   ntd=0;
    co[1]=S;    viz[S]=nrbf;
    while (inc<=sf)
    {
        el=co[inc]; inc++;
        if (el==D)
            break;
        for (it=ma[el].begin();it!=ma[el].end();it++)
            if (cap[el][*it]>fl[el][*it])
            {
                if (viz[*it]<nrbf)
                {
                    viz[*it]=nrbf;
                    co[++sf]=*it;
                    t[*it]=el;
                }
                if ((*it)==D)
                    td[++ntd]=el;
            }
    }
}

void rezolvare()
{
    while (1)
    {
        bfs();
        if (viz[D]==nrbf)
            for (i=1;i<=ntd;i++)
            {
                t[D]=td[i];
                nod=D;  fmin=inf;
                while ((nod>S) && (fmin>0))
                {
                    if (fmin>cap[t[nod]][nod]-fl[t[nod]][nod])
                        fmin=cap[t[nod]][nod]-fl[t[nod]][nod];
                    nod=t[nod];
                }
                nod=D;
                if (fmin>0)
                    while (nod>S)
                    {
                        fl[t[nod]][nod]+=fmin;
                        fl[nod][t[nod]]-=fmin;
                        nod=t[nod];
                    }
                rez+=fmin;
            }
        else
            break;
    }
}

void afisare()
{
    printf("%ld\n",rez);
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            if (fl[i][j+n]!=0)
                printf("%ld %ld\n",i,j);
}

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