Cod sursa(job #387236)

Utilizator mihaimoldovanMihai Moldovan mihaimoldovan Data 27 ianuarie 2010 09:15:38
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<fstream>
#define maxn 10005
struct nod
{
	int info;
	nod *next;
};
nod *g[maxn];
int n,m,i,l[maxn],r[maxn],u[maxn];
int pereche(int x)
{
	if(u[x])
		return 0;
	u[x]=1;
	for(nod *t=g[x];t;t=t->next)//caut perechea pt x
		if(r[t->info]==0||pereche(r[t->info]))
		{
			l[x]=t->info;
			r[t->info]=x;	
			return 1;
		}
	return 0;
}
int main()
{
	int e,x,y;
	nod *t;
	FILE *in=fopen("cuplaj.in","r");
	fscanf(in,"%d%d%d",&n,&m,&e);
	for(;e;--e)
	{
		fscanf(in,"%d%d",&x,&y);
		t=new nod;
        t->info=y;
        t->next=g[x];
        g[x]=t;
	}
	fclose(in);
	int cuplaj=0; //cuplajul maxim
	int gata=0;
	while(!gata)
	{
		gata=1;
		for(i=1;i<=n;++i)
			u[i]=0;
		for (i=1;i<=n;++i)
            if (l[i]==0)//daca nu are pereche
                if (pereche(i))//caut perechea
                {
                    ++cuplaj;
                    gata=0;//ca la bubble sort
                }
	}
	FILE *out=fopen("cuplaj.out","w");
	fprintf(out,"%d\n", cuplaj);
    for(i=1;i<=n;++i)
		if (l[i])
			fprintf(out,"%d %d\n", i, l[i]);
	fclose(out);
	return 0;
}