Cod sursa(job #584452)

Utilizator bugyBogdan Vlad bugy Data 25 aprilie 2011 16:12:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define dim 10005
using namespace std;

int *A[dim],n,m,i,x,y,j,L[dim],R[dim],NR,gasit,ok,l1,r1;
short int viz[dim];

void citire()
{
	FILE *f=fopen("cuplaj.in","r");
	
fscanf(f,"%d %d %d",&n,&m,&m);

for(i=0;i<=n;i++)
{
	A[i]=(int *) realloc (A[i] , sizeof(int));
	A[i][0]=0;
}

for(i=1;i<=m;i++)
{
	fscanf(f,"%d %d",&x,&y);
		
	A[x][0]++;
	A[x]=(int *)realloc (A[x],(A[x][0]+1) * sizeof(int));
	A[x][A[x][0]]=y;	
}

fclose(f);
}



void afisare()
{
FILE *g=fopen("cuplaj.out","w");
	
fprintf(g,"%d\n",NR);
for(i=1;i<=n;i++)
	if(L[i] && R[L[i]]==i)
	fprintf(g,"%d %d\n",i,L[i]);	
	
fclose(g);
}



int solve(int x)
{
	int i; // l r
	
	if(viz[x]==1) return 0;	
	
	viz[x]=1;
	
	for(i=1;i<=A[x][0];i++)
		if(! R[ A[x][i] ])
		{
			L[x]=A[x][i];
			R[A[x][i]]=x;
			return 1;
		}
		
	for(i=1;i<=A[x][0];i++)
		if(solve( R[ A[ x ][ i ] ] ))
		{
			L[x]=A[x][i];
			R[A[x][i]]=x;
			return 1;
		}
	return 0;
}

void cuplaj()
{
int i,ok=0;	

while(!ok)
{	
	ok=1;
	memset(viz,0,sizeof(viz));

	for(i=1;i<=n;i++)	
	if(!L[i])
		if( solve( i ) )
			ok=0;
}

	for(i=1;i<=n;i++)	
		if(L[i])
			NR++;
}


int main()
{
citire();
cuplaj();
afisare();

return 0;
}