Cod sursa(job #2209086)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 1 iunie 2018 18:16:10
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
#define N 10005

using namespace std;

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

int a , b , n ,sol;
vector<int> graf[N] ;
bool verif[N] ;
int left1[N],right1[N] ;

void citire()
{
    int x , y , i ;
    fin >> a >> b >> n ;
    for ( i = 1 ; i <= n ; i++ )
    {
        fin >> x >> y ;
        graf[x].push_back(y) ;
    }
}

bool cuplaj(int nod)
{
    if ( verif[nod] == true )
        return false;
    verif[nod] = true ;
    for ( auto vecin:graf[nod] )
    {
        if ( right1[vecin] == 0 )
        {
            left1[nod] = vecin;
            right1[vecin] = nod ;
            sol++;
            return true ;
        }
    }
    for ( auto vecin:graf[nod] )
    {
        if ( cuplaj(right1[vecin]) == 1 )
        {
            left1[nod] = vecin ;
            right1[vecin] = nod ;
            return true ;
        }
    }
    return false;
}

int main()
{
    bool ok=false;
    citire() ;
    do
    {
        ok = false;
        memset(verif,false,sizeof(verif));
        for ( int i = 1 ; i <= n ; i++ )
            if ( left1[i] == 0 )
                ok = ok |cuplaj(i) ;
    } while ( ok == true ) ;
    fout << sol << '\n' ;
    for ( int i = 1 ; i <= a ; i++ )
    {
        if ( left1[i] != 0 )
            fout << i << " " << left1[i] << '\n' ;
    }
}