Cod sursa(job #239861)

Utilizator RobybrasovRobert Hangu Robybrasov Data 5 ianuarie 2009 23:34:25
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
//brut
#include <cstdio>
#include <queue>
#include <vector>
#define N 10001

using namespace std;

int n,m,e,i,x,y,flux,s,j,tata[2*N];
short int f[2*N][2*N],E[2*N];
vector<int> L[2*N];
vector<int>::iterator it;
queue<int> C;

int bfs(int nod)
{
    E[nod]=1;
    for (C.push(nod); !C.empty(); C.pop())
        for (it=L[C.front()].begin(); it!=L[C.front()].end(); it++)
            if (!E[*it] && f[C.front()][*it])
            {
                tata[*it]=C.front();
                if (*it==s) return 1;
                E[*it]=1;
                C.push(*it);
            }
    return 0;
}

void clear()
{
    memset(E,0,sizeof(E));
    memset(tata,0,sizeof(tata));
    for (; !C.empty(); C.pop());
}

void scrie(int nod)
{
    for (it=L[nod].begin(); it!=L[nod].end(); it++)
        if (f[*it][nod])
        {
            printf("%d %d\n",nod,*it-n);
            return;
        }
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d\n",&n,&m,&e);
    s=n+m+1;
    for (i=1; i<=e; i++)
    {
        scanf("%d%d\n",&x,&y);
        L[x].push_back(n+y);
        L[n+y].push_back(x);
        L[n+y].push_back(s);
        f[x][n+y]=1;
        f[n+y][s]=1;
    }
    flux=0;
    for (i=1; i<=n+m; i++)
    {
        clear();
        if (bfs(i))
        {
            for (j=s; tata[j]; j=tata[j])
            {
                f[tata[j]][j]-=1;
                f[j][tata[j]]+=1;
            }
            flux++;
        }
    }
    printf("%d\n",flux);
    for (i=1; i<=n; i++) scrie(i);

    return 0;
}