Cod sursa(job #287827)
using namespace std;
#include <cstdio>
#include <vector>
#include <algorithm>
#define Nmax 10010
vector <int> V[Nmax];
int viz[Nmax], l[Nmax], r[Nmax];
int n, m, R, x, y, nr, i;
int pairup(int nod){
if(viz[nod]) return 0;
viz[nod] = 1;
vector <int>::iterator it;
int fiu;
for(it = V[nod].begin(); it != V[nod].end() ; it++){
fiu = *it;
if( !r[fiu] ){
l[nod] = fiu;
r[fiu] = nod;
return 1;
}
}
for( it = V[nod].begin(); it != V[nod].end(); it++){
fiu = *it;
if( pairup( r[fiu] ) ){
l[nod] = fiu;
r[fiu] = nod;
return 1;
}
}
return 0;
}
int main(){
FILE *f = fopen("cuplaj.in", "r");
FILE *g = fopen("cuplaj.out", "w");
fscanf(f,"%d %d %d",&n, &m, &R);
for(i = 1; i <= R; i++){
fscanf(f,"%d %d",&x, &y);
V[x].push_back(y);
}
for(i=1; i <= n; i++)
if(!l[i]){
if( pairup(i) )
nr++;
else{
memset(viz, 0, sizeof(viz));
if(pairup(i))
nr++;
}
}
fprintf(g,"%d\n",nr);
for(i = 1; i <= n; i++)
if( l[i] )
fprintf(g,"%d %d\n",i, l[i]);
fclose(f);
fclose(g);
return 0;
}