Pagini recente » Cod sursa (job #1918753) | Cod sursa (job #208138) | Cod sursa (job #619755) | Cod sursa (job #2370682) | Cod sursa (job #2802110)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 1e5;
vector <int> edges[2 * NMAX + 1];
int viz[2 * NMAX + 1];
int pereche[2 * NMAX + 1];
bool reimperechere( int node ) {
viz[node] = 1;
for ( auto it : edges[node] ) {
int x = pereche[it];
if ( x == 0 ) {
pereche[node] = it;
pereche[it] = node;
return 1;
}
if ( !viz[x] && reimperechere( x ) ) {
pereche[node] = it;
pereche[it] = node;
return 1;
}
}
return 0;
}
int main() {
ifstream fin( "cuplaj.in" );
ofstream fout( "cuplaj.out" );
int n, m, e, i;
fin >> n >> m >> e;
for ( i = 0; i < e; i ++ ) {
int a, b;
cin >> a >> b;
edges[a].push_back( b + n );
edges[b + n].push_back( a );
}
int cuplaj = 0, sepoate = 1;
while ( sepoate ) {
sepoate = 0;
for ( i = 1; i <= n + m; i ++ ) {
viz[i] = 0;
}
for ( i = 1; i <= n; i ++ ) {
if ( !viz[i] && !pereche[i] && reimperechere( i ) ) {
sepoate = 1;
cuplaj ++;
}
}
}
fout << cuplaj << '\n';
for ( i = 1; i <= n; i ++ ) {
if ( pereche[i] ) {
fout << i << ' ' << pereche[i] - n << '\n';
}
}
return 0;
}