Cod sursa(job #386965)

Utilizator mihaimoldovanMihai Moldovan mihaimoldovan Data 26 ianuarie 2010 14:13:31
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<fstream>
using namespace std;
#define MAX 100010
struct muchie
{	
	int a,b,c;
	muchie *next;
};
muchie *g[MAX*2], tm[MAX*2];
int fmax,n,m,e;
int cmin,t[MAX];
void adauga(int i,int j,int cf)
{
	muchie *p=new muchie;
	p->a=i;
	p->b=j;
	p->c=cf;
	p->next=g[i];
	g[i]=p;
}
muchie * adresa(int i,int j)
{
	for(muchie *p=g[i];p;p=p->next)
		if(p->b==j)
			return p;
	return NULL;
}
int bfs()
{
	int cd[MAX*2];
	int st,dr;
	st=dr=1;
	for(int i=0;i<=n+m+1;i++)
		t[i]=-2;
	t[0]=-1;
	cd[1]=0;
	while(st<=dr)
		{
			for(muchie *p=g[cd[st]];p;p=p->next)
			{
				int i=p->b;
				if(t[i]==-1&&p->c)
				{
					cd[++dr]=i;
					t[i]=cd[st];
				}
			}
			st++;
			if(cd[st]==n+m+1)
				return 1;		
		}
	return 0;
}
void flux()
{
	muchie *p;
	while(bfs())
	{
		for(int j=n+1;j<=n+m;j++)
			{
				p=adresa(j,n+m+1);
				if(p!=NULL&&p->c!=0&&t[j]!=-2)
				{
					t[n+m+1]=j;
					int i=t[n+m+1];
					int min=5;//va deveni 0 sau 1
					while(i!=-1)
						{
							p=adresa(i,n+m+1);
							if(p&&p->c<min)
								min=p->c;
							i=t[i];
						}	
					fmax+=min;
					i=t[n+m+1];
					while(i!=-1)
						{
							p=adresa(i,n+m+1);
							if(p)
								p->c-=min;
							p=adresa(n+m+1,i);
							if(p)
								p->c+=min;
							i=t[i];
						}	
				}
			}
	}
}
int main()
{
	int x,y;
	FILE *fin=fopen("cuplaj.in","r");
	fscanf(fin,"%d%d%d",&n,&m,&e);
	for(int i=1;i<=e;i++)
	{
		fscanf(fin,"%d%d",&x,&y);
		adauga(x,y+n,1);
		adauga(y+n,x,0);
	}
	for(int i=1; i<=n;i++)
    {   
    	adauga(0,i,1);
        adauga(i,0,0);
    }
    for(int i=n+1; i<=n+m;i++)
    {
        adauga(i,n+m+1,1);
        adauga(n+m+1,i,0);
    }
	flux();
	FILE *fout=fopen("cuplaj.out","w");
	fprintf(fout,"%d\n",fmax);
    int gasit;
    muchie *p;
    for(int i=1;i<=n;i++)
        for(p=g[i],gasit=0; p && !gasit; p=p->next)
            if(p->b>n && p->c==0)
                fprintf(fout,"%d %d \n",i,p->b-n),gasit=1;
	return 0;
}