Pagini recente » Cod sursa (job #661744) | Cod sursa (job #1544593) | Cod sursa (job #3255229) | Cod sursa (job #232788) | Cod sursa (job #256742)
Cod sursa(job #256742)
#include <stdio.h>
#include <iostream.h>
#define IN "cuplaj.in"
#define OUT "cuplaj.out"
#define MAX 10005
FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");
struct NOD
{
int nod;
NOD *next;
}*A[MAX];
int dest[MAX];
int p[MAX];
int v[MAX];
int N,M,e;
int cnt;
void cuplaj();
void pairup();
int main ()
{
int i,a,b;
fscanf(fin,"%d %d %d",&N,&M,&e);
for(i=1;i<=e;++i)
{
fscanf(fin,"%d %d",&a,&b);
NOD *q=new (NOD);
q->nod=b;
q->next=A[a];
A[a]=q;
}
cuplaj();
return 0;
}
int pairup(int nod)
{
v[nod]=1;
for(NOD *q = A[nod]; q != NULL; q = q->next)
if (!dest[q->nod])
{
dest[q->nod] = nod;
p[nod] = q->nod;
return 1;
}
for (NOD *q = A[nod]; q != NULL; q = q->next)
if (!v[dest[q->nod]])
if (pairup(dest[q->nod]))
{
dest[q->nod] = nod;
p[nod] = q->nod;
return 1;
}
return 0;
}
void cuplaj ()
{
int ok,i;
ok=1;
while (ok)
{
ok=0;
memset(v,0,sizeof(v));
for(i=1;i<=N;++i)
if(!p[i])
if(pairup(i))
{
ok=1;
++cnt;
}
}
fprintf(fout,"%d\n",cnt);
for(i=1;i<=N;++i)
if(p[i])
fprintf(fout,"%d %d\n",i,p[i]);
}