Cod sursa(job #1758544)

Utilizator din99danyMatei Daniel din99dany Data 17 septembrie 2016 14:09:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;

#define NMAX 10005

vector < int > v[ NMAX ];

int       vizt[ NMAX ],
    cuPerecheA[ NMAX ],
    cuPerecheB[ NMAX ];

bool realoca( int nod ){

    if( vizt[ nod ] ) return 0;
    vizt[ nod ] = 1;

    vector < int > :: iterator it;

    for( it = v[ nod ].begin(); it != v[ nod ].end(); ++it ){
        if( !cuPerecheA[ *it ] ){
            cuPerecheA[ *it ] = nod;
            cuPerecheB[ nod ] = *it;
            return 1;
        }
    }

    for( it = v[ nod ].begin(); it != v[ nod ].end(); ++it ){
        if( realoca( cuPerecheA[ *it ] ) ){
            cuPerecheA[ *it ] = nod;
            cuPerecheB[ nod ] = *it;
            return 1;
        }
    }

    return 0;

}

int main()
{

    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    int n, m, i, j, x, y, s, d, k;

    scanf("%d%d%d",&n,&m,&k);
    while( k-- ){
        scanf("%d%d",&x,&y);
        v[ x ].push_back( y );
    }

    s = 0;
    do{
        k = 0;
        memset( vizt, 0, sizeof( vizt ) );
        for( i = 1; i <= n; ++i )
            if( !cuPerecheB[ i ] && realoca( i ) )  s++, k = 1;
    }while( k );

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

    return 0;

}