Pagini recente » Cod sursa (job #2010991) | Cod sursa (job #494446) | Profil roxxyy | Cod sursa (job #2930008) | Cod sursa (job #1058252)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
const int MAX_N = 10010;
vector <int> G[MAX_N];
int N, M, IN[MAX_N], OUT[MAX_N], l[MAX_N], r[MAX_N];
bool viz[MAX_N];
bool path( int nod ){
vector<int>::iterator it;
if( viz[nod] == 1 ) return 0;
viz[nod] = 1;
for( it = G[nod].begin(); it != G[nod].end(); ++it )
if( r[(*it)] == 0 ){
l[nod] = (*it);
r[(*it)] = nod;
return 1;
}
for( it = G[nod].begin(); it != G[nod].end(); ++it )
if( path( r[(*it)] ) ){
l[nod] = (*it);
r[(*it)] = nod;
return 1;
}
return 0;
}
void solve(){
bool e = true;
while( e ){
e = false;
memset( viz, 0, sizeof( viz ) );
for( int i = 1; i <= N; ++i )
if( l[i] == 0 && path( i ) ) e = true;
}
}
int main()
{
ifstream cin( "cuplaj.in" );
ofstream cout( "cuplaj.out" );
int E;
cin >> N >> M >> E;
for( int i = 1; i <= E; ++i ){
int x, y;
cin >> x >> y;
G[x].push_back( y );
}
solve();
int sol = 0;
for( int i = 1; i <= N; ++i )
if( l[i] ) ++sol;
cout << sol << "\n";
for( int i = 1; i <= N; ++i )
if( l[i] ) cout << i << " " << l[i] << "\n";
return 0;
}