Pagini recente » Borderou de evaluare (job #571854) | Borderou de evaluare (job #2018383) | Borderou de evaluare (job #1293373) | Borderou de evaluare (job #2187966) | Cod sursa (job #1967484)
#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] == -1 || PairUp(Pair[son])){
Pair[node] = son;
Pair[son] = node;
return 1;
}
return 0;
}
int Match(){
int card = 0;
bool change = true;
memset(Pair, -1, sizeof(Pair));
while(change){
change = false;
for(int i = 1; i <= N; ++ i)
if(Pair[i] == -1){
used.reset();
change |= PairUp(i);
}
}
for(int i = 1; i <= N; ++ i)
if(Pair[i] != -1) ++ card;
return card;
}
void write(){
printf("%d\n", Match());
for(int i = 1; i <= N; ++ i)
if(Pair[i] != -1)
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;
}