Cod sursa(job #522734)

Utilizator mvbinfoDragos Dinca mvbinfo Data 15 ianuarie 2011 23:05:36
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 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);
}


int cauta(int x)
{
	int i;
	
	for(i=1;i<=A[x][0];i++)
		if(! R[ A[x][i] ])
			return A[x][i];
	return 0;	
}

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



int main()
{
	FILE *g=fopen("cuplaj.out","w");
	
	citire();
	

for(i=1;i<=n;i++)
{
	if(A[i][0] && !L[i])
	{	
	memset(viz,0,sizeof(viz));
		
	if( solve( i ) )
			NR++;	
	}

}
	
	
	
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);
return 0;
}