Cod sursa(job #398216)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 18 februarie 2010 11:22:26
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<algorithm>
using namespace std;
#include<vector>
#define DIM 10005

vector <int> lst[DIM];

struct ok
{
    int x,y;
} sol[DIM];
int n,m,s,v[DIM];
void read ()
{
    int i,e,x,y;
    scanf("%d%d%d",&n,&m,&e);
    for(i=1;i<=e;++i)
    {
        scanf("%d%d",&x,&y);
        lst[x].push_back (y);
    }
}
int mp (int x)
{
    int i;
    if(v[x])
        return 0;
    v[x]=1;
    for(i=0;i<lst[x].size ();++i)
        if(!sol[lst[x][i]].y)
        {
            sol[x].x=lst[x][i];
            sol[lst[x][i]].y=x;
            return 1;
        }
    for(i=0;i<lst[x].size ();++i)
        if(mp(sol[lst[x][i]].y))
        {
            sol[x].x=lst[x][i];
            sol[lst[x][i]].y=x;
            return 1;
        }
    return 0;
}
void solve ()
{
    int i,ok;
    do
    {
        for(i=1;i<=n;++i)
            v[i]=0;
        ok=0;
        for(i=1;i<=n;++i)
            if(!sol[i].x && mp(i)) 
            {
                ++s;
                ok=1;
            }
    }
    while(ok);
}
void show ()
{
    int i;
    printf("%d\n",s);
    for(i=1;i<=n;++i)
        if(sol[i].x)
            printf("%d %d\n",i,sol[i].x);
    
}
int main ()
{
    freopen ("cuplaj.in","r",stdin);
    freopen ("cuplaj.out","w",stdout);
    read ();
    solve ();
    show ();
    return 0;    
}