Pagini recente » Cod sursa (job #2762633) | Cod sursa (job #493981) | Cod sursa (job #204662) | Cod sursa (job #796184) | Cod sursa (job #370864)
Cod sursa(job #370864)
#include<stdio.h>
#define infile "cuplaj.in"
#define outfile "cuplaj.out"
#define nmax (10*1001)
#define lmax (100*1001)
struct list
{
int n,p; //nodul si pozitia urmatoare
} l[lmax]; //lista grafului normal
char viz[nmax]; //vizite
int le[nmax]; //le[i]=cu ce nod din partea dreapta e legat nodul i din partea stanga
int ri[nmax]; //ri[i]=cu ce nod din partea stanga e legat nodul i din partea dreapta
int p[nmax]; //pozitia catre lista a nodurilor primului graf
int n,m; //numarul de noduri ale celor doua grafuri
int nr; //numarul maxim de cuplari
void add(int poz, int x, int y)
{
l[poz].p=p[x]; l[poz].n=y; p[x]=poz;
}
void read()
{
int i,k,u,v;
scanf("%d %d %d\n",&n,&m,&k);
for(i=1;i<=k;i++)
{
scanf("%d %d\n",&u,&v);
add(i,u,v);
}
}
int imperechere(int i)
{
if(viz[i]) return 0;
viz[i]=1;
int j;
for(j=p[i];j;j=l[j].p)
if(!ri[l[j].n] || imperechere(ri[l[j].n]))
{
le[i]=l[j].n;
ri[l[j].n]=i;
return 1;
}
return 0;
}
void cuplaj()
{
int i,ok=1;
while(ok)
{
ok=0;
for(i=1;i<=n;i++) viz[i]=0;
for(i=1;i<=n;i++)
if(!le[i] && imperechere(i))
ok=1,nr++;
}
}
void write()
{
int i;
printf("%d\n",nr);
for(i=1;i<=n;i++)
if(le[i])
printf("%d %d\n",i,le[i]);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
cuplaj();
write();
fclose(stdin);
fclose(stdout);
return 0;
}