Cod sursa(job #1415105)

Utilizator vasica38Vasile Catana vasica38 Data 3 aprilie 2015 19:32:17
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

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

nod a[10111];
int rr[10001],l[10001],i,j,k,m,u,n,n1;


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

bool cuplaj(int x)
{
    if (viz[x]) return false;
    viz[x]=1;
    nod r=a[x];
    while (r)
    {
        if (!rr[r->info] || cuplaj(rr[r->info]))
        {
            rr[r->info]=x;
            l[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,&n1,&m);
    for (i=1; i<=m; ++i)
    {
    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(!l[i]) ok+=cuplaj(i);
    }
    int nr=0;
    for (i=1; i<=n; ++i)
            if (l[i]) ++nr;
    printf("%d\n",nr);
    for (i=1; i<=n; ++i)
            if (l[i]) printf("%d %d\n",i,l[i]);
    return 0;
}