Cod sursa(job #867312)

Utilizator costyv87Vlad Costin costyv87 Data 29 ianuarie 2013 15:52:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#define nm 10100
#define FOR(i,v) for (vector <int> ::iterator i=v.begin();i!=v.end();i++)
using namespace std;
FILE *f,*g;
vector <int> a[nm];
int bf[nm],l[nm],r[nm];
int n,m,e,i,x,y,sol;
bool ok;

int add(int x)
{
    if (bf[x]==1) return 0;
    bf[x]=1;

    FOR (i,a[x])
        if (!r[*i])
        {
            l[x]=*i;
            r[*i]=x;
            return 1;
        }
    FOR (i,a[x])
        if (add(r[*i]))
        {
            l[x]=*i;
            r[*i]=x;
            return 1;
        }
    return 0;
}

int main()
{
    f=fopen("cuplaj.in","r");
    g=fopen("cuplaj.out","w");

    fscanf(f,"%d%d%d",&n,&m,&e);

    for (i=1;i<=e;i++)
    {
        fscanf(f,"%d%d",&x,&y);
        a[x].push_back(y);
    }

    for (ok=true;ok;)
    {
        for (i=1;i<=n;i++)
            bf[i]=0;
        for (i=1,ok=false;i<=n;i++)
            if (!l[i])
                ok|=add(i);
    }

    for (i=1;i<=n;i++)
        if (l[i]>0) sol++;
    fprintf(g,"%d\n",sol);
    for (i=1;i<=n;i++)
        if (l[i]>0)
            fprintf(g,"%d %d\n",i,l[i]);


	return 0;
}