Cod sursa(job #692914)

Utilizator gabriel93Robu Gabriel gabriel93 Data 26 februarie 2012 20:51:06
Problema Cuplaj maxim in graf bipartit Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
using namespace std;
FILE *f;
int n,m,e,l[10002],r[10002],viz[10002];

struct nod
{
	int x;
	nod *adresa;
};
nod *a[10002];

void adaug(int x,int y)
{
	nod *p;
	p=new nod;
	p->x=y;
	p->adresa=a[x];
	a[x]=p;
}

void citire()
{
	int i,x,y;
	f=fopen("cuplaj.in","rt");
	fscanf(f,"%d %d %d",&n,&m,&e);
	for(i=1;i<=n+m;i++)
		a[i]=0;
	for(i=1;i<=e;i++)
	{
		fscanf(f,"%d %d",&x,&y);
		adaug(x,y);
	}
	fclose(f);
}

int cuplaj(int x)
{
	nod *p;
	if(viz[x])
		return 0;
	viz[x]=1;
	for(p=a[x];p!=0;p=p->adresa)
		if(!r[p->x])
		{
			l[x]=p->x;
			r[p->x]=x;
			return 1;
		}
	for(p=a[x];p!=0;p=p->adresa)
		if(cuplaj(p->x))
		{
			l[x]=p->x;
			r[p->x]=x;
			return 1;
		}
	return 0;
}

void scrie()
{
	int c,i;
	f=fopen("cuplaj.out","wt");
	c=0;
	for(i=1;i<=n;i++)
		if(l[i])
			c++;
	fprintf(f,"%d\n",c);
	for(i=1;i<=n;i++)
		if(l[i])
			fprintf(f,"%d %d\n",i,l[i]);
	fclose(f);
}

int main()
{
	int i,ok;
	citire();
	ok=1;
	while(ok)
	{
		ok=0;
		for(i=1;i<=n;i++)
			viz[i]=0;
		for(i=1;i<=n;i++)
			if(!l[i])
				ok=ok+cuplaj(i);
	}
	scrie();
	return 0;
}