Cod sursa(job #1311285)

Utilizator gerd13David Gergely gerd13 Data 7 ianuarie 2015 22:08:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cstring>


using namespace std ;

const int NMAX = 10005 ;
const int INF = 0x3f3f3f3f;


ifstream fin("cuplaj.in") ;
ofstream fout("cuplaj.out") ;


int N, M, E, cuplaj;

vector <int> G[NMAX] ;

int L[NMAX], r[NMAX], u[NMAX] ;

///#########################################################

inline void READ()
{


    fin >> N >> M >> E ;

    for(int i = 1 ; i <= E ; ++ i)
    {

        int x, y ;

        fin >> x >> y;

        G[x].push_back(y) ;
    }
}



///#########################################################

inline int pairup(const int n)
{
    if(u[n])
        return 0 ;

    u[n] = 1 ;

for(vector <int> ::iterator it = G[n].begin() ; it != G[n].end() ;  ++ it)
        if(!r[*it])
    {

        L[n] = *it ;
        r[*it] = n ;
        return 1 ;
    }

    for(vector <int> ::iterator it = G[n].begin() ; it != G[n].end() ;  ++ it)
        if(pairup(r[*it]))
    {

        L[n] = *it ;
        r[*it] = n ;
        return 1 ;
    }

    return  0 ;
}

///#########################################################

inline void SOLVE()
{
    for(int ok = 1 ; ok;)
    {
        ok = 0 ;
        memset(u, 0, sizeof(u)) ;

        for(int i = 1 ; i <= N ; ++ i)
            if(!L[i])
                ok |= pairup(i) ;

    }

    for(int i = 1 ; i <= N ; ++ i)
        cuplaj = cuplaj + (L[i] > 0) ;

}

///#########################################################

inline void OUT()
{

    fout << cuplaj << '\n' ;

    for(int i = 1 ; i <= N ; ++i)
        if(L[i] > 0)
            fout << i << ' ' << L[i] << '\n' ;
}

///#########################################################

int main()
{
    READ() ;
    SOLVE() ;
    OUT() ;
    fin.close() ;
    fout.close() ;
    return 0 ;
}