Pagini recente » Cod sursa (job #2302532) | Cod sursa (job #239163) | Cod sursa (job #1002416) | Cod sursa (job #597689) | Cod sursa (job #3236563)
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100001
using namespace std;
ifstream fin( "cuplaj.in" );
ofstream fout( "cuplaj.out" );
vector <int> edges[NMAX];
int l, r;
int pr[NMAX], pr2[NMAX], viz[NMAX];
int match( int node ) {
if( viz[node] )
return 0;
viz[node] = 1;
int g = 0;
for( unsigned int i = 0; i < edges[node].size() && g == 0; i++ ) {
int newnode = edges[node][i];
if( pr2[newnode] == 0 ) {
pr[node] = newnode;
pr2[newnode] = node;
g = 1;
}
}
for( unsigned int i = 0; i < edges[node].size() && g == 0; i++ ) {
int newnode = edges[node][i];
if( match( pr2[newnode] ) ) {
pr[node] = newnode;
pr2[newnode] = node;
g = 1;
}
}
return g;
}
void cuplaj() {
int g = 1;
while( g ) {
g = 0;
for( int i = 1; i <= l; i++ )
if( pr[i] == 0 )
g = g + match( i );
for( int i = 1; i <= l; i++ ) viz[i] = 0;
}
}
int main() {
int x, y, m;
fin >> l >> r >> m;
for( int i = 0; i < m; i++ ) {
fin >> x >> y;
y += l;
edges[x].push_back( y );
// edges[y].push_back( x );
}
cuplaj();
int cnt = 0;
for( int i = 1; i <= l; i++ ) {
if( pr[i] != 0 )
cnt++;
}
fout << cnt << '\n';
for( int i = 1; i <= l; i++ ) {
if( pr[i] != 0 )
fout << i << ' ' << pr[i] - l << '\n';
}
return 0;
}