Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 195 si 223 | Cod sursa (job #3292509) | Diferente pentru implica-te/arhiva-educationala intre reviziile 203 si 223 | Diferente pentru implica-te/arhiva-educationala intre reviziile 220 si 223 | Cod sursa (job #3293246)
#include <stdio.h>
#include <vector>
constexpr int NIL = -1;
const int MAXN = 2 * 10000;
std::vector<int> adj[MAXN];
int pair[MAXN];
bool viz[MAXN];
bool try_pair( int u ) {
viz[u] = true;
for( int v : adj[u] )
if( pair[v] == NIL ){
pair[v] = u;
pair[u] = v;
return true;
}
for( int v : adj[u] ){
if( viz[v] )
continue;
viz[v] = true;
if( try_pair( pair[v] ) ){
pair[v] = u;
pair[u] = v;
return true;
}
}
return false;
}
int main() {
FILE *fin = fopen( "cuplaj.in", "r" );
FILE *fout = fopen( "cuplaj.out", "w" );
int left, right, m;
fscanf( fin, "%d%d%d", &left, &right, &m );
int n = left + right;
for( int i = 0; i < n; i++ )
pair[i] = NIL;
for( int i = 0; i < m; i++ ){
int a, b;
fscanf( fin, "%d%d", &a, &b );
a--; b--;
b += left;
adj[a].push_back( b );
adj[b].push_back( a );
}
{ // baga cuplaj tati
bool same = false;
while( !same ){
same = true;
for( int i = 0; i < n; i++ )
viz[i] = false;
for( int i = 0; i < left; i++ )
if( !viz[i] && try_pair( i ) )
same = false;
}
}
std::vector<std::pair<int, int>> edges;
for( int i = 0; i < left; i++ )
if( pair[i] != NIL )
edges.emplace_back( i + 1, pair[i] - left + 1 );
fprintf( fout, "%d\n", (int)edges.size() );
for( auto [a, b]: edges )
fprintf( fout, "%d %d\n", a, b );
fclose( fin );
fclose( fout );
return 0;
}