Pagini recente » Cod sursa (job #534625) | Cod sursa (job #2298278) | Cod sursa (job #2582068) | Cod sursa (job #1595800) | Cod sursa (job #611330)
Cod sursa(job #611330)
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 20001
#define pb push_back
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
vector< int > G[NMAX];
int N1, N2, M, x, y, i, CuplajMax = 0, St[NMAX], Dr[NMAX];
bool USED[NMAX];
inline bool Cupleaza( int NOD )
{
if( USED[NOD] ) return false;
USED[NOD] = 1;
for( vector< int >::iterator Vecin = G[NOD].begin(); Vecin != G[NOD].end(); Vecin++ )
if( !Dr[*Vecin] || Cupleaza( Dr[*Vecin] ) )
{
St[NOD] = *Vecin;
Dr[*Vecin] = NOD;
return true;
}
return false;
}
int main()
{
in >> N1 >> N2 >> M;
for( ; M--; )
{
in >> x >> y;
G[x].pb( N1 + y );
G[N1 + y].pb( x );
}
memset( USED, false, sizeof(USED) );
memset( St, 0, sizeof(St) );
memset( Dr, 0, sizeof(Dr) );
for( i = 1; i <= N1; i++ )
if( !St[i] )
{
if( Cupleaza( i ) ) ++CuplajMax;
else
{
memset( USED, false, sizeof(USED) );
if( Cupleaza( i ) ) ++CuplajMax;
}
}
out << CuplajMax << '\n';
for( i = 1; i <= N1; i++ )
if( St[i] ) out << i << ' ' << St[i] - N1 << '\n';
return 0;
}