Cod sursa(job #551151)

Utilizator nickyyLal Daniel Emanuel nickyy Data 10 martie 2011 14:00:41
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.74 kb
#include <stdio.h>
#include <stdlib.h>
#define maxn 2*10005
#define infinit 1<<30
int * a[maxn];
int * q;
int dist[maxn],pereche[maxn];
int n,m,cuplaj;

	void citire(void)
	{	FILE *fin=fopen("cuplaj.in","r");
		int e,x,y,k;
		fscanf(fin,"%d%d%d",&n,&m,&e);
		for(k=1;k<=n+m;k++)
			a[k]=(int*)realloc(a[k],sizeof(int)), a[k][0]=0;
		for(; e; e--)
		{	fscanf(fin,"%d%d",&x,&y);
			y+=n;
			a[x][0]++;
			a[x]=(int*)realloc(a[x], sizeof(int)*(a[x][0]+1));
			a[x][a[x][0]]=y;
		}
		fclose(fin);
	}

	int bfs(void)
	{	int v,u,k;
		int prim,ultim;
		prim=ultim=0;
		for(v=1;v<=n;v++)
			if(!pereche[v])
			{	dist[v]=0;
				q=(int*)realloc(q,sizeof(int)*(ultim+1));
				q[ultim++]=v;
			}
			else dist[v]=infinit;
		dist[0]=infinit;
		while(prim<ultim)
		{	v=q[prim++];
			if(v!=0)
				for(k=1; k<=a[v][0]; k++)
				{	u=a[v][k];
					if(dist[pereche[u]]==infinit)
					{	dist[pereche[u]]=dist[v]+1;
						q=(int*)realloc(q,(ultim+1)*sizeof(int));
						q[ultim++]=pereche[u];
					}
				}
		}
		return dist[0]!=infinit;
	}

	int dfs(int v)
	{	int i,u;
		if(v!=0)
		{	for(i=1; i<=a[v][0]; i++)
			{	u=a[v][i];
				if(dist[pereche[u]]==dist[v]+1)
					if(dfs(pereche[u]))
					{	pereche[u]=v;
						pereche[v]=u;
						return 1;
					}
			}
			dist[v]=infinit;
			return 0;
		}
		return 1;
	}

	void HopcroftKarp(void)
	{	int v;
	    cuplaj=0;
		while(bfs())
			for(v=1; v<=n; v++)
				if(!pereche[v])
					if(dfs(v)) cuplaj++;
	}

	void scrie(void)
	{	FILE *fout=fopen("cuplaj.out","w");
		int i;
		fprintf(fout,"%d\n",cuplaj);
		for(i=1;i<=n;i++)
			if(pereche[i]!=0) fprintf(fout,"%d %d\n",i,pereche[i]-n);
		fclose(fout);
	}

int main(void)
{	citire();
	HopcroftKarp();
	scrie();
	return 0;
}