Cod sursa(job #1396361)

Utilizator vasica38Vasile Catana vasica38 Data 22 martie 2015 14:17:50
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<stdio.h>

using namespace std;

typedef struct lista
{
    int info;
    lista *next;
} * nod;

int i,j,k,m,n,u,e;
bool viz[10002];
int left[10002],right[10002];
nod a[10002];

void add(int x, nod &p)
{
    nod r=new lista;
    r->info=x;
    r->next=p;
    p=r;
}

bool hopcraft(int x)
{
    nod r=a[x];
    if (viz[x]) return false;
    viz[x]=1;
    while (r)
    {
        if (!right[r->info] || hopcraft(right[r->info]))
        {
            right[r->info]=x;
            left[x]=r->info;
            return true;
        }
    r=r->next;
    }
return false;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&n,&m,&e);
    while (e--)
    {
            int x,y;
            scanf("%d%d",&x,&y);
            add(y,a[x]);
    }
    bool ok=true;
    while (ok)
    {
        ok=false;
        for (i=1; i<=n; ++i) viz[i]=0;
        for (i=1; i<=n; ++i)
                if (!left[i]) ok+=hopcraft(i);
    }
    int sol=0;
    for (i=1; i<=n; ++i)
        if (left[i]) ++sol;
    printf("%d\n",sol);
    for (i=1; i<=n; ++i)
        if (left[i]) printf("%d %d\n",i,left[i]);
return 0;
}