Cod sursa(job #239868)

Utilizator RobybrasovRobert Hangu Robybrasov Data 5 ianuarie 2009 23:59:48
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
//brut
#include <cstdio>
#include <cstring>
#include <queue>
#define N 10010

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],st[3][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 afla(int nod)
{
    for (p=L[nod]; p; p=p->urm)
        if (f[p->val][nod])
        {
            flux++;
            st[1][flux]=nod;
            st[2][flux]=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;
    }
    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;
            }
        clear();
    }
    flux=0;
    for (i=1; i<=n; i++) afla(i);
    printf("%d\n",flux);
    for (i=1; i<=flux; i++) printf("%d %d\n",st[1][i],st[2][i]);

    return 0;
}