Cod sursa(job #398751)

Utilizator bixcabc abc bixc Data 19 februarie 2010 12:06:34
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <vector>
using namespace std;

#define Nmax 10010

void citire ();
int l, r, m, i, n;
int viz[Nmax], L[Nmax], R[Nmax];
vector <int> V[Nmax];

int cuplaj (int nod) {
	
	if (viz[nod]) return 0;
	viz[nod] = 1; int i;
	
	for (i = 0; i < (int) V[nod].size (); i++)
		if (!L[ V[nod][i] ]) {
			R[nod] = V[nod][i];
			L[ V[nod][i] ] = nod;
			return 1;
		}
	
	for (i = 0; i < (int) V[nod].size (); i++)
		if (L[ V[nod][i] ] && cuplaj ( L[V[nod][i]] ) ) {
			R[nod] = V[nod][i];
			L[ V[nod][i] ] = nod;
			return 1;
		}	
	
	return 0;
} 

int main () {

	freopen ("cuplaj.in", "r", stdin);
	freopen ("cuplaj.out", "w", stdout);
	
	citire ();
	
	for (int ok = 1; ok; ) {
		ok = 0;
		memset (viz, 0, sizeof (viz));
		
		for (i = 1; i <= l; i++)
			if (!R[i]) 
				if ( cuplaj (i) ) ok = 1;
	}
	
	int sol = 0;
	for (i = 1; i <= l; i++)
		if (R[i]) sol++;
	
	printf ("%d\n", sol);
	for (i = 1; i <= l; i++)
		if (R[i]) printf ("%d %d\n", i, R[i]);
 
	return 0;
}

void citire () {
	
	int i, x, y;
	
	scanf ("%d %d %d", &l, &r, &m);
	for (i = 1; i <= m; i++) {
		scanf ("%d %d", &x, &y);
		V[x].push_back (y);
	}
	
}