Cod sursa(job #904675)

Utilizator valentina506Moraru Valentina valentina506 Data 4 martie 2013 18:52:45
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
#include<vector>
using namespace std;
int n,m,i,j,e,l[100001],r[100001],uz[100001],x,y,rez,ok;
vector<int> b[100001];

int cupleaza(int x)
{
    int i;
    if(uz[x]==1)
        return 0;

    uz[x]=1;
    for(i=0;i<b[x].size();++i)
        if(!r[b[x][i]])
        {
            l[x]=b[x][i];
            r[b[x][i]]=x;
            return 1;
        }

        for(i=0;i<b[x].size();++i)
            if(cupleaza(r[b[x][i]]))
            {
                l[x]=b[x][i];
                r[b[x][i]]=x;
                return 1;
            }

            return 0;
}


void init()
{
    for(int i=1;i<=n;++i)
        uz[i]=0;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

    scanf("%d%d%d",&n,&m,&e);
    for(i=1;i<=e;++i)
    {
        scanf("%d%d",&x,&y);
        b[x].push_back(y+n);
        b[y+n].push_back(x);
    }

    while(!ok)
    {
        ok=1;
        init();
        for(i=1;i<=n;++i)
            if(!l[i]&&cupleaza(i))
                ok=0;
    }

    for(i=1;i<=n;++i)
        if(l[i])
            rez++;

        printf("%d\n",rez);
        for(i=1;i<=n;++i)
            if(l[i])
                printf("%d %d\n",i,l[i]-n);
            return 0;
}