Pagini recente » Cod sursa (job #1912326) | Cod sursa (job #1239034) | Cod sursa (job #3147977) | Cod sursa (job #250951) | Cod sursa (job #699571)
Cod sursa(job #699571)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define NMAX 10001
#define pb push_back
int N1, N2, M, x, y, i, Lanturi, CuplajMax;
int St[NMAX], Dr[NMAX];
vector< int > G[NMAX];
bool Used[NMAX];
inline int Cupleaza( int Nod )
{
if( Used[Nod] ) return 0;
Used[Nod] = true;
for( vector< int >::iterator it = G[Nod].begin(); it != G[Nod].end(); ++it )
if( !Dr[*it] )
{
St[Nod] = *it;
Dr[*it] = Nod;
return 1;
}
for( vector< int >::iterator it = G[Nod].begin(); it != G[Nod].end(); ++it )
if( Cupleaza( *it ) )
{
St[Nod] = *it;
Dr[*it] = Nod;
return 1;
}
return 0;
}
int main()
{
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
scanf("%d%d%d", &N1, &N2, &M );
for( ; M--; )
{
scanf("%d%d", &x, &y );
G[x].pb( y );
}
memset( St, 0, sizeof(St) );
memset( Dr, 0, sizeof(Dr) );
for( Lanturi = 1; Lanturi; )
{
Lanturi = 0;
memset( Used, false, sizeof(Used) );
for( i = 1; i <= N1; ++i )
if( !St[i] )
Lanturi += Cupleaza( i );
}
for( CuplajMax = 0, i = 1; i <= N1; ++i )
CuplajMax += (int)( St[i] > 0 );
printf("%d\n", CuplajMax );
for( i = 1; i <= N1; ++i )
if( St[i] )
printf("%d %d\n", i, St[i] );
return 0;
}