Cod sursa(job #239864)

Utilizator RobybrasovRobert Hangu Robybrasov Data 5 ianuarie 2009 23:54:43
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
//brut
#include <cstdio>
#include <cstring>
#include <queue>
#define N 1001

using namespace std;

typedef struct noduri
{
    int val;
    noduri *urm;
} adr;

int n,m,e,i,x,y,flux,s,j,tata[2*N],f[2*N][2*N],E[2*N];
adr *L[2*N],*p;
queue<int> C;

int bfs(int nod)
{
    E[nod]=1;
    for (C.push(nod); !C.empty(); C.pop())
        for (p=L[C.front()]; p; p=p->urm)
            if (!E[p->val] && f[C.front()][p->val])
            {
                tata[p->val]=C.front();
                if (p->val==s) return 1;
                E[p->val]=1;
                C.push(p->val);
            }
    return 0;
}

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

void scrie(int nod)
{
    for (p=L[nod]; p; p=p->urm)
        if (f[p->val][nod])
        {
            printf("%d %d\n",nod,p->val-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);
        p=new adr; p->val=n+y; p->urm=L[x]; L[x]=p;
        p=new adr; p->val=x; p->urm=L[n+y]; L[n+y]=p;
        p=new adr; p->val=s; p->urm=L[n+y]; L[n+y]=p;
        f[x][n+y]=1;
        f[n+y][s]=1;
    }
    flux=0;
    for (i=1; i<=n+m; i++)
    {
        if (bfs(i))
        {
            for (j=s; tata[j]; j=tata[j])
            {
                f[tata[j]][j]=0;
                f[j][tata[j]]=1;
            }
            flux++;
        }
        clear();
    }
    printf("%d\n",flux);
    for (i=1; i<=n; i++) scrie(i);

    return 0;
}