Pagini recente » Cod sursa (job #163059) | Cod sursa (job #304121) | Cod sursa (job #286215) | Cod sursa (job #46569) | Cod sursa (job #409721)
Cod sursa(job #409721)
#include<stdio.h>
#include<string.h>
#define NMAX 10100
#define MMAX 100100
int y[NMAX],z[NMAX],l[NMAX],r[NMAX],d[NMAX],*x[NMAX],i,j,n,m,k,p,a,b;
struct kkt
{
int X,Y;
};
kkt q[MMAX];
int pairup(int nod)
{
if (z[nod])
return 0;
z[nod]=1;
for (int i=1;i<=x[nod][0];i++)
if (!r[x[nod][i]])
{
l[nod]=x[nod][i];
r[x[nod][i]]=nod;
return 1;
}
for (i=1;i<=x[nod][0];i++)
if (pairup(r[x[nod][i]]))
{
l[nod]=x[nod][i];
r[x[nod][i]]=nod;
return 1;
}
return 0;
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for (i=1;i<=p;i++)
{
scanf("%d%d",&q[i].X,&q[i].Y);
z[q[i].X]++;
}
for (i=1;i<=n;i++)
{
x[i]= new int [z[i]+2];
x[i][0]=0;
}
for (i=1;i<=p;i++)
x[q[i].X][++x[q[i].X][0]]=q[i].Y;
a=1;
while (a)
{
a=0;
memset(z,0,sizeof(z));
for (i=1;i<=n;i++)
if (!l[i])
a+=pairup(i);
}
a=0;
for (i=1;i<=n;i++)
if (l[i])
a++;
printf("%d\n",a);
for (i=1;i<=n;i++)
if (l[i])
printf("%d %d\n",i,l[i]);
return 0;
}