Pagini recente » Cod sursa (job #2195418) | Cod sursa (job #1679652) | Cod sursa (job #206045) | Cod sursa (job #2281383) | Cod sursa (job #359983)
Cod sursa(job #359983)
#include <algorithm>
#include <vector>
using namespace std;
#define DIM ( 1<<10 )
#define INF ( 1<<30 )
#define pb push_back
#define sz size()
int e, n, m, cuplaj;
int D, S;
int cd[ DIM ], tat[ DIM ], viz[ DIM ], cst[ DIM ][ DIM ];
vector<int> vec[ DIM ];
void init_viz() {
int i;
for( i = 0; i <= D; ++i )
viz[ i ] = 0;
}
int bf() {
int st, dr, aux, nod;
unsigned int i;
init_viz();
cd[ 0 ] = S;
viz[ S ] = 1;
for( st = dr = 0; st <= dr; ++st )
if( cd[ st ] != D ) {
nod = cd[ st ];
for( i = 0; i < vec[ nod ].sz; ++i ) {
aux = vec[ nod ][ i ];
if( cst[ nod ][ aux ] > 0 && !viz[ aux ] ) {
viz[ aux ] = 1;
cd[ ++dr ] = aux;
tat[ aux ] = nod;
}
}
}
return viz[ D ];
}
void read() {
int i, x0, y0;
scanf( "%d %d %d", &n, &m, &e );
S = 0;
D = n+m+1;
for( i = 0; i < e; ++i ) {
scanf( "%d %d", &x0, &y0 );
vec[ x0 ].pb( y0+n );
vec[ y0+n ].pb( x0 );
cst[ x0 ][ y0+n ] = 1;
vec[ S ].pb( x0 );
vec[ x0 ].pb( S );
cst[ S ][ x0 ] = 1;
vec[ D ].pb( y0+n );
vec[ y0+n ].pb( D );
cst[ y0+n ][ D ] = 1;
}
}
void solve() {
int nod, fmin;
unsigned int i;
for( cuplaj = 0; bf(); )
for( i = 0; i < vec[ D ].sz; ++i ) {
nod = vec[ D ][ i ];
if( cst[ nod ][ D ] > 0 && viz[ nod ] ) {
tat[ D ] = nod;
fmin = INF;
for( nod = D; nod != S; nod = tat[ nod ] )
fmin = min( fmin, cst[ tat[ nod ] ][ nod ] );
if( fmin ) {
for( nod = D; nod != S; nod = tat[ nod ] ) {
cst[ tat[ nod ] ][ nod ] -= fmin;
cst[ nod ][ tat[ nod ] ] += fmin;
}
++cuplaj;
}
}
}
}
void print() {
freopen( "cuplaj.in", "r", stdin );
int i, x0, y0;
scanf( "%d %d %d", &n, &m, &e );
printf( "%d\n", cuplaj );
for( i = 0; i < e; ++i ) {
scanf( "%d %d", &x0, &y0 );
if( !cst[ x0 ][ y0+n ] )
printf( "%d %d\n", x0, y0 );
}
}
int main() {
freopen( "cuplaj.in", "r", stdin );
freopen( "cuplaj.out", "w", stdout );
read();
solve();
print();
return 0;
}