Cod sursa(job #1377014)

Utilizator sorynsooSorin Soo sorynsoo Data 5 martie 2015 19:43:13
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int m,n,e,st[10011],dr[10011],poz[10011],nr,i,x,y;
int uok=true;;
vector <int> graf[100101];
int cuplaj(int i);
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);
        graf[x].push_back(y);
    }

    while(uok)
    {
        for(i=1; i<=n; i++)
            poz[i]=false;

        uok=0;
        for(i=1;i<=n;++i)
        {
            if(st[i]==0)
                uok+=cuplaj(i); // am cuplat, mai merg in while
        }
    }

    for(i=1;i<=n;++i)
       if(st[i])
            nr++;

    printf("%d\n",nr);
    for(i=1;i<=n;++i)
        if(st[i])
            printf("%d %d\n",i,st[i]);

    return 0;
}
int cuplaj( int i)
{
    if(poz[i]) // deja vizitat
        return 0;

    poz[i]=true;
    for(int h=0; h<graf[i].size(); h++)
    {
        int next=graf[i][h];

        if(!dr[next] || cuplaj(dr[next])) // daca este cuplat gasesc alta varianta de cuplare ...daca nu cuplez pur si simplu
        {
             st[i]=next;
             dr[next]=i;
             return 1;
        }
    }
    return 0;
}