Cod sursa(job #956689)

Utilizator matei_cChristescu Matei matei_c Data 3 iunie 2013 17:33:09
Problema Cuplaj maxim in graf bipartit Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<vector>
#include<cstring>
using namespace std ;

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

#define maxn 10001

int N, M, E ;

vector<int> vecini[maxn] ;

int cine[maxn] ;
bool sel[maxn], sel2[maxn] ;
int cuplaj[maxn] ;

int nr ;

void citire()
{
    fin >> N >> M >> E ;

    for(int i = 1; i <= E; ++i )
    {
        int a, b ;
        fin >> a >> b ;
        vecini[ a + M ].push_back( b ) ;
    }
}

bool dfs(int nod)
{
    if(sel2[nod-M])
        return 0;
    sel2[nod-M] = true;
    for(size_t i = 0; i < vecini[nod].size(); ++i )
    {
        int nod_act = vecini[nod][i] ;

        if( sel[nod_act] == false )
        {
            cuplaj[ nod - M ] = nod_act ;
            cine[nod_act] = nod ;
            sel[nod_act] = true ;
            return 1 ;
        }

        int vechi = cine[nod_act] ;

        if  ( !dfs( cine[nod_act] ) ) continue;

        cuplaj[ nod - M ] = nod_act ;
        cine[nod_act] = nod ;
        return 1 ;


    }

    return 0 ;
}

int main()
{
    citire() ;

    for(int i = 1; i <= N; ++i )
    {
        memset(sel2, false, sizeof(sel2));
        nr += dfs( i + M ) ;
    }

    fout << nr << "\n" ;

    for(int i = 1; i <= N; ++i )
        if( cuplaj[i] )
            fout << i << " " << cuplaj[i] << "\n" ;

    return 0 ;
}