Pagini recente » Cod sursa (job #2358834) | Cod sursa (job #2911907) | Cod sursa (job #2128018) | Cod sursa (job #2512370) | Cod sursa (job #2375024)
#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' ;
}