Pagini recente » Profil Ubb_Moldovan | Cod sursa (job #2311541) | Cod sursa (job #346066) | Cod sursa (job #694840) | Cod sursa (job #304064)
Cod sursa(job #304064)
#include <iostream>
#include <algorithm>
#include <vector>
#define FIN "cuplaj.in"
#define FOUT "cuplaj.out"
#define MAX 10010
#define PB push_back
using namespace std;
char sel[MAX];
int stanga[MAX],dreapta[MAX];
int N,M,E;
vector<int> vecini[MAX];
int STEP=0;
void iofile(void){
freopen(FIN,"rt",stdin);
freopen(FOUT,"wt",stdout);
scanf("%d%d%d",&N,&M,&E);
int x,y;
for (int i=1;i<=E;++i){
scanf("%d%d",&x,&y);
vecini[x].PB(y);
}
fclose(stdin);
}
int pairUp(int nod){
if (sel[nod]>=STEP){return 0;}
sel[nod]=STEP;
for (int i=1;i<=vecini[nod].size();++i){
int vecin=vecini[nod][i-1];
if (!stanga[vecin]){
stanga[vecin]=nod;
dreapta[nod]=vecin;
return 1;
}
}
for (int i=1;i<=vecini[nod].size();++i){
int vecin=vecini[nod][i-1];
if (pairUp(stanga[vecin])){
stanga[vecin]=nod;
dreapta[nod]=vecin;
return 1;
}
}
return 0;
}
void cuplaj(void){
STEP=0;
int ok=1,i;
for (;ok;){
++STEP;
for (i=1,ok=0;i<=N;++i){
if (!dreapta[i]){
ok|=pairUp(i);
}
}
}
int cuplajmax=0;
for (int i=1;i<=N;++i) if (dreapta[i])++cuplajmax;
printf("%d\n",cuplajmax);
for (int i=1;i<=N;++i) if (dreapta[i]) printf("%d %d\n",i,dreapta[i]);
fclose(stdout);
}
int main(void){
iofile();
cuplaj();
return 0;
}