Cod sursa(job #563438)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 25 martie 2011 09:28:59
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#include<vector>
#define maxN 10005

using namespace std;

FILE*f=fopen("cuplaj.in","r");
FILE*g=fopen("cuplaj.out","w");

int N,M,NrM,i,Nr,L[maxN],R[maxN],Viz[maxN],X,Y,ok;

vector<int> A[maxN];

int connect(int nod){
	if ( Viz[nod] )	return 0;
	
	Viz[nod] = 1;
	
	for ( int i = 0 ; i < A[nod].size() ; ++i ){
		
		int nodvcn = A[nod][i];
		
		if ( !R[ nodvcn ] ){
			
			L[nod] = nodvcn;
			R[nodvcn] = nod;
			
			return 1;
			
		}
	}
	
	for ( int i = 0 ; i < A[nod].size() ; ++i ){
		
		int nodvcn = A[nod][i];
		
		if ( connect ( R[nodvcn] ) ){
			
			L[nod] = nodvcn;
			R[nodvcn] = nod;
			
		}
		
	}
	
	return 0;
	
}

int main () {
	
	fscanf(f,"%d %d %d",&N,&M,&NrM);
	
	for ( i = 1 ; i <= NrM ; ++i ){
		fscanf(f,"%d %d",&X,&Y);
		A[X].push_back(Y);
	}
	
	do{
		
		ok = 0;
		
		memset(Viz,0,sizeof(Viz));
		
		for ( i = 1 ; i <= N ; ++i ){
			if ( !L[i] ){
				
				if ( connect(i) )
					ok = 1;
				
			}
		}
		
		
		
	}while( ok );
	
	for ( i = 1 ; i <= N ; ++i ){
		if ( L[i] )
			++Nr;
	}
	
	fprintf(g,"%d\n",Nr);
	
	for ( i = 1 ; i <= N ; ++i ){
		
		if ( L[i] ){
			fprintf(g,"%d %d\n",i,L[i]);
		}
		
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}