Pagini recente » Istoria paginii utilizator/aeroh | Statistici Stefan Ciurea (stefan_ciurea) | Istoria paginii utilizator/az234 | teleport | Cod sursa (job #1707025)
#include <cstdio>
#include <vector>
#include <bitset>
const int SIZE = 1e5 + 5;
int left[SIZE], right[SIZE], n, m, k, x, y, answer, ok;
std::vector <int> edge[SIZE]; std::bitset <SIZE> marked;
inline bool vertex_cover( int node ) {
std::vector <int> :: iterator it;
if( marked[node] )
return false;
marked[node] = 1;
for( it = edge[node].begin(); it != edge[node].end(); it ++ ) {
int next_node = *it;
if( !right[next_node] ) {
left[node] = next_node;
right[next_node] = node;
answer ++;
return true;
}
}
for( it = edge[node].begin(); it != edge[node].end(); it ++ ) {
int next_node = *it;
if( vertex_cover( right[next_node] ) ) {
left[node] = next_node;
right[next_node] = node;
return true;
}
}
return false;
}
int main( int argc, const char *argv[] ) {
freopen( "cuplaj.in" , "r", stdin );
freopen( "cuplaj.out", "w", stdout );
scanf( "%d %d %d", &n, &m, &k );
for( int i = 1; i <= k; i ++ ) {
scanf( "%d %d", &x, &y );
edge[x].push_back(y);
}
do {
marked.reset(); ok = 1;
for( int i = 1; i <= n; i ++ ) {
if( !left[i] && vertex_cover(i) )
ok = 0;
}
} while( !ok );
printf( "%d\n", answer );
for( int i = 1; i <= n; i ++ ) {
if( left[i] )
printf( "%d %d\n", i, left[i] );
}
return 0;
}