Pagini recente » Cod sursa (job #954171) | Cod sursa (job #3141168) | Cod sursa (job #1162512) | Cod sursa (job #474138) | Cod sursa (job #969284)
Cod sursa(job #969284)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int MAX_N = 2*10100;
int N,M;
bool taken[MAX_N];
int mate[MAX_N];
vector<int> G[MAX_N];
bool match(const int nod)
{
if(taken[nod])
return 0;
taken[nod] = 1;
for(auto it : G[nod])
if(!mate[it]){
taken[it] = 1;
mate[nod] = it;
mate[it] = nod;
return 1;
}
for(auto it : G[nod])
if(match(mate[it])){
mate[it] = nod;
mate[nod] = it;
return 1;
}
return 0;
}
int main()
{
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
int E;
scanf("%d%d%d",&N,&M,&E);
int x,y;
while(E--){
scanf("%d%d",&x,&y);
y += N+1;
G[x].push_back(y);
G[y].push_back(x);
}
int i,changeth = 1;
while(changeth){
changeth = 0;
memset(taken,0,sizeof(taken));
for(i = 1 ; i <= N ; ++ i)
if(!mate[i])
changeth += match(i);
}
changeth = 0;
for(i = 1 ; i <= N ; ++ i)
changeth += mate[i] > 0;
printf("%d\n",changeth);
for(i = 1 ; i <= N ; ++ i)
if(mate[i])
printf("%d %d\n",i,mate[i]-N-1);
return 0;
}