Cod sursa(job #2375024)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 7 martie 2019 21:53:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
using namespace std;
const int NR = 10005 ;
ifstream in ("cuplaj.in") ;
ofstream out ("cuplaj.out") ;
vector < int > v [ NR ] ;
bool viz [ NR ] , change = 1 ;
int r [ NR ] , c [ NR ] , n , m , e , x , y , i , cnt ;
bool cupla ( const int &nod )
{
    if ( viz [ nod ] )  return 0 ;  /// a intrat in ciclu
    viz [ nod ] = 1 ;
    /// cauta in vecinii directi
    for ( vector < int > :: iterator it = v[ nod ].begin() ; it != v [ nod ].end() ; ++ it )
    {
        if ( !r [ *it ] )
        {
            c [ nod ] = *it ;
            r [ *it ] = nod ;
            return 1 ; /// a gasit
        }
    }
    /// obliga cuplatul fiecarui vecin sa gaseasca pe altcineva
    for ( vector < int > :: iterator it = v[ nod ].begin() ; it != v [ nod ].end() ; ++ it )
    {
        if ( cupla ( r [ *it ] ) ) /// a gasit
        {
            c [ nod ] = *it ;
            r [ *it ] = nod ;
            return 1 ;
        }
    }
    return 0 ; /// :( poate pe urmatorul test
}
int main ()
{
    in >> n >> m >> e ;
    while ( e -- )
    {
        in >> x >> y ;
        v [ x ].push_back(y) ;
    }
    while ( change )
    {
        change = 0 ;
        for ( i = 1 ; i <= n ; ++ i ) viz [ i ] = 0 ;
        for ( i = 1 ; i <= n ; ++ i )   if ( !c [ i ] )
        change |= cupla ( i ) ;
    }

    for ( i = 1 ; i <= n ; ++ i ) if ( c [ i ] )    cnt ++ ;
    out << cnt << '\n' ;
    for ( i = 1 ; i <= n ; ++ i )
    if ( c [ i ] )  out << i << ' ' << c [ i ] << '\n' ;
}