Pagini recente » Cod sursa (job #916587) | Borderou de evaluare (job #906904) | Borderou de evaluare (job #1886136) | Borderou de evaluare (job #2819773) | Cod sursa (job #1967487)
#include <bits/stdc++.h>
#define maxN 10002
FILE *fin = freopen("cuplaj.in", "r", stdin);
FILE *fout = freopen("cuplaj.out", "w", stdout);
using namespace std;
int N, M, E;
vector <int> G[2*maxN];
int Pair[2*maxN];
bitset <2*maxN> used;
bool PairUp(int node){
if(used.test(node)) return 0;
used.set(node);
for(int son : G[node])
if(!Pair[son] || PairUp(Pair[son])){
Pair[node] = son;
Pair[son] = node;
return 1;
}
return 0;
}
int Match(){
int card = 0;
bool change = true;
while(change){
change = false;
for(int i = 1; i <= N; ++ i)
if(!Pair[i]){
used.reset();
change |= PairUp(i);
}
}
for(int i = 1; i <= N; ++ i)
if(Pair[i]) ++ card;
return card;
}
void write(){
printf("%d\n", Match());
for(int i = 1; i <= N; ++ i)
if(Pair[i])
printf("%d %d\n", i, Pair[i] - N);
}
int main(){
scanf("%d %d %d", &N, &M, &E);
for(int i = 1; i <= E; ++ i){
int x, y;
scanf("%d %d", &x, &y);
G[x].push_back(y + N);
G[y + N].push_back(x);
}
write();
return 0;
}