Cod sursa(job #691571)

Utilizator andrei.finaruFinaru Andrei Emanuel andrei.finaru Data 26 februarie 2012 12:19:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

struct node
{
    int nr;
    node *next;
} *v[10005],*p;
int n,m,l[10005],r[10005],ok,c,e,x,y;
char ut[10005];

int cupleaza(int k)
{
    if(ut[k]) return 0;
    ut[k]='1';
    node *q=v[k];
    while(q)
    {
        if(!r[q->nr])
        {
            l[k]=q->nr;
            r[q->nr]=k;
            return 1;
        }
        q=q->next;
    }
    q=v[k];
    while(q)
    {
        if(cupleaza(r[q->nr]))
        {
            l[k]=q->nr;
            r[q->nr]=k;
            return 1;
        }
        q=q->next;
    }
    return 0;
}

int main()
{
    int i;
    f>>n>>m>>e;
    for(i=1;i<=e;++i)
    {
        f>>x>>y;
        p=new node;
        p->nr=y;
        p->next=v[x];
        v[x]=p;
    }
    ok=1;
    while(ok)
    {
        ok=0;
        memset(ut,0,sizeof(ut));
        for(i=1;i<=n;++i)
            if(!l[i]) ok+=cupleaza(i);
    }
    for(i=1;i<=n;++i) if(l[i]) ++c;
    g<<c<<'\n';
    for(i=1;i<=n;++i)
        if(l[i]) g<<i<<' '<<l[i]<<'\n';
    f.close(); g.close();
    return 0;
}