Pagini recente » Borderou de evaluare (job #1206757) | Borderou de evaluare (job #2275300) | Borderou de evaluare (job #221483) | Borderou de evaluare (job #438043) | Cod sursa (job #1967495)
#include <bits/stdc++.h>
#define maxN 20002
FILE *fin = freopen("cuplaj.in", "r", stdin);
FILE *fout = freopen("cuplaj.out", "w", stdout);
using namespace std;
int N, M, E;
vector <int> G[maxN];
int Pair[maxN];
bitset <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;
do{
change = false;
used.reset();
for(int i = 1; i <= N; ++ i)
if(!Pair[i])
change |= PairUp(i);
}while(change);
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;
}