Cod sursa(job #287827)

Utilizator katakunaCazacu Alexandru katakuna Data 25 martie 2009 11:09:26
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
using namespace std;
#include <cstdio>
#include <vector>
#include <algorithm>

#define Nmax 10010

vector <int> V[Nmax];
int viz[Nmax], l[Nmax], r[Nmax];
int n, m, R, x, y, nr, i;

int pairup(int nod){

	if(viz[nod]) return 0;
	viz[nod] = 1;
	
	vector <int>::iterator it;
	int fiu;
	for(it = V[nod].begin(); it != V[nod].end() ; it++){
		fiu = *it;
		if( !r[fiu] ){ 
			l[nod] = fiu; 
			r[fiu] = nod;
			return 1;
		}		
	}

	for( it = V[nod].begin(); it != V[nod].end(); it++){
		fiu = *it;
		if( pairup( r[fiu] ) ){
			l[nod] = fiu; 
			r[fiu] = nod;
			return 1;
		}
	}
	
	return 0;
}

int main(){

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

	fscanf(f,"%d %d %d",&n, &m, &R);
	for(i = 1; i <= R; i++){
		fscanf(f,"%d %d",&x, &y);
		V[x].push_back(y);
	}
	
	for(i=1; i <= n; i++)
		if(!l[i]){
			if( pairup(i) )
				nr++;
			
			else{
				memset(viz, 0, sizeof(viz));
				if(pairup(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;
}