Pagini recente » Cod sursa (job #1734606) | Cod sursa (job #2261416) | Cod sursa (job #2609019) | Cod sursa (job #3180522) | Cod sursa (job #465422)
Cod sursa(job #465422)
#include <cstdio>
#include <cstring>
#define DN 10005
struct nod {
int x;
nod *urm;
}*v[DN];
int n,m,e,
l[DN],//nodurile din dreapta care sunt cuplate cu nodurile din stanga
r[DN],//nodurile din stanga care sunt cuplate cu nodurile din dreapta
u[DN];
void adaugare(int x,int y) {
nod *p;
p=new nod;
p->x=y;
p->urm=v[x];
v[x]=p;
}
bool cupleaza(int sursa) {
nod *p;
if(u[sursa]) return false;
u[sursa]=1;
for(p=v[sursa]; p!=NULL; p=p->urm)
if(!r[p->x]){
l[sursa]=p->x;
r[p->x]=sursa;
return true;
}
for(p=v[sursa]; p!=NULL; p=p->urm)
if(cupleaza(r[p->x])) {
l[sursa]=p->x;
r[p->x]=sursa;
return true;
}
return false;
}
int main()
{
int i,x,y,cont=0;
bool ok=true;
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d",&n,&m,&e);
for(i=1; i<=e; i++) {
scanf("%d %d",&x,&y);
adaugare(x,y);
}
while (ok) {
ok=false;
memset(u,0,sizeof(u));
for(i=1; i<=n; i++)
if(!l[i])//nodul i nu a fost cuplat
ok=ok|cupleaza(i);
}
for(i=1; i<=n; i++) if(l[i]) ++cont;
printf("%d\n",cont);
for(i=1;i<=n;i++) if (l[i] > 0)
printf("%d %d\n", i, l[i]);
return 0;
}