Cod sursa(job #1517694)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 4 noiembrie 2015 18:21:03
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <vector>

using namespace std;

vector<int> a[10005];
int L[10005],R[10005],n,m,i,X,Y,z;
bool marked[10005];

inline bool cupleaza(int nod)
{
    vector<int> :: iterator it;

    marked[nod]=1;
    for(it=a[nod].begin();it!=a[nod].end();++it)
    if(!R[*it])
    {
        L[nod]=*it;
        R[*it]=nod;
        return 1;
    }

    for(it=a[nod].begin();it!=a[nod].end();++it)
    if(!marked[R[*it]] && cupleaza(R[*it]))
    {
        L[nod]=*it;
        R[*it]=nod;
        return 1;
    }
    return 0;
}

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

    scanf("%d%d%d",&n,&m,&z);

    for(i=1;i<=z;++i)
    {
        scanf("%d%d",&X,&Y);
        a[X].push_back(Y);
    }
    bool done=1;
    while(done)
    {
         done=0;
         for(i=1;i<=n;++i) marked[i]=0;

         for(i=1;i<=n;++i)
         if(!L[i] && !marked[i]) done|=cupleaza(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;
}