Pagini recente » Cod sursa (job #3127397) | Cod sursa (job #3263212) | Cod sursa (job #2271537) | Cod sursa (job #327882) | Cod sursa (job #551173)
Cod sursa(job #551173)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 10005
int *a[maxn];
int L[maxn],R[maxn],Uz[maxn];
int n,m;
void citire(void)
{ FILE *fin=fopen("cuplaj.in","r");
int k,x,y,p;
fscanf(fin,"%d%d%d",&n,&m,&p);
for(k=1;k<=n;k++) a[k]=(int*)realloc(a[k],sizeof(int)), a[k][0]=0;
for(; p; p--)
{ fscanf(fin,"%d%d",&x,&y);
a[x][0]++;
a[x]=(int*)realloc(a[x],(a[x][0]+1)*sizeof(int));
a[x][a[x][0]]=y;
}
fclose(fin);
}
int pereche(int u)
{ int i;
if(Uz[u]) return 0;
Uz[u]=1;
for(i=1;i<=a[u][0];i++)
if(!R[a[u][i]])
{ L[u]=a[u][i];
R[a[u][i]]=u;
return 1;
}
for(i=1;i<=a[u][0];i++)
if(pereche(R[a[u][i]]))
{ L[u]=a[u][i];
R[a[u][i]]=u;
return 1;
}
return 0;
}
void scrie(void)
{ FILE *fout=fopen("cuplaj.out","w");
int i,ok,cuplaj;
do
{ ok=0;
memset(Uz,0,sizeof(Uz));
for(i=1;i<=n;i++)
if(L[i]==0) ok=ok | pereche(i);
}while(ok);
for(cuplaj=0,i=1; i<=n;i++)
cuplaj+=( L[i]>0 );
fprintf(fout,"%d\n",cuplaj);
for(i=1;i<=n;i++)
if(L[i]>0) fprintf(fout,"%d %d\n",i,L[i]);
fclose(fout);
}
int main(void)
{ citire();
scrie();
return 0;
}