Cod sursa(job #287842)

Utilizator katakunaCazacu Alexandru katakuna Data 25 martie 2009 11:33:04
Problema Cuplaj maxim in graf bipartit Scor 100
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 n, m, R, x, y, i, ok, nr;
int l[Nmax], r[Nmax], viz[Nmax];

int pairup(int nod){

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

	for( it = V[nod].begin(); it != V[nod].end(); it++ ){
		if( pairup( r[*it] ) ){
			l[nod] = *it;
			r[*it] = 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(ok = 1; ok ; ){
		ok = 0;
		memset(viz, 0, sizeof(viz));
		
		for(i = 1; i <= n; i++)
			if(!l[i])
				if(pairup(i))
					ok = 1;
		
	}
	
	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;
}