Pagini recente » Cod sursa (job #2714331) | Cod sursa (job #1277279) | Cod sursa (job #2163089) | Cod sursa (job #685840) | Cod sursa (job #302644)
Cod sursa(job #302644)
#include <stdio.h>
#include <string.h>
#define NM 20001
int nrst,nrdr,e,f;
struct list{int nod;list *urm;} *g[NM];
int viz[NM];
int st[NM],dr[NM];
inline void add(int x,int y)
{list *p=new list;
p->nod=y;
p->urm=g[x];
g[x]=p;
}
int pair(int k)
{if (viz[k]) return 0;
viz[k]=1;
list *p;
for (p=g[k];p;p=p->urm)
if (!dr[p->nod])
{dr[p->nod]=k;
st[k]=p->nod;
return 1;
}
for (p=g[k];p;p=p->urm)
if (pair(dr[p->nod]))
{st[k]=p->nod;
dr[p->nod]=k;
return 1;
}
return 0;
}
int main()
{freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d",&nrst,&nrdr,&e);
int i,x,y;
for (i=1;i<=e;i++)
{scanf("%d %d",&x,&y);
add(x,y);
}
int sw=1;
while (sw)
{sw=0;
memset(viz,0,sizeof(viz));
for (i=1;i<=nrst;i++)
if (!st[i]) sw=sw+pair(i);
}
for (i=1;i<=nrst;i++) if (st[i]) f++;
printf("%d\n",f);
for (i=1;i<=nrst;i++)
if (st[i]) printf("%d %d\n",i,st[i]);
return 0;
}