Cod sursa(job #314647)

Utilizator AndreyPAndrei Poenaru AndreyP Data 12 mai 2009 12:21:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define N 10010
#define pb push_back
int n,m,e;
vector<int> a[N];
bool viz[N];
int l[N],r[N],rez;
inline void citire()
{
    scanf("%d%d%d",&n,&m,&e);
    int x,y;
    for(int i=0; i<e; ++i)
    {
        scanf("%d%d",&x,&y);
        a[x].pb(y);
    }
}
bool pairup(int nod)
{
    if(viz[nod])
        return false;
    viz[nod]=true;
    for(int i=0,lim=a[nod].size(); i<lim; ++i)
    {
        if(!r[a[nod][i]])
        {
            l[nod]=a[nod][i];
            r[a[nod][i]]=nod;
            return true;
        }
    }
    for(int i=0,lim=a[nod].size(); i<lim; ++i)
    {
        if(pairup(r[a[nod][i]]))
        {
            l[nod]=a[nod][i];
            r[a[nod][i]]=nod;
            return true;
        }
    }
    return false;
}
inline void rezolva()
{
    bool change=true;
    while(change)
    {
        change=false;
        memset(viz,0,sizeof(viz));
        for(int i=1; i<=n; ++i)
        {
            if(!l[i])
                change|=pairup(i);
        }
    }
    for(int i=1; i<=n; ++i)
    {
        if(l[i])
            ++rez;
    }
}
inline void scrie()
{
    printf("%d\n",rez);
    for(int i=1; i<=n; ++i)
    {
        if(l[i])
            printf("%d %d\n",i,l[i]);
    }
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    citire();
    rezolva();
    scrie();
    return 0;
}