Cod sursa(job #529568)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 5 februarie 2011 14:23:48
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>
#include <vector>
#include <bitset>

#define maxN 10050

using namespace std;

vector <int> g[maxN];
bitset <maxN> viz;
int n, m, l[maxN], r[maxN], sol;
inline bool cupleaza (int node)
{	
	if (viz[node]) return 0;

	viz[node] = 1;

	for (vector <int> :: iterator it = g[node].begin (); it != g[node].end (); it++)
		if (!r[*it] || cupleaza (r[*it])) {
			
			r[*it] = node;
			l[node] = *it;
			return 1;
		}
	return 0;
}
int main ()
{


	freopen ("cuplaj.in", "r", stdin);
	freopen ("cuplaj.out", "w", stdout);
	
	int edges, i, x, y;
	for (scanf ("%d %d %d\n", &n, &m, &edges); edges--; ) {

		scanf ("%d %d\n", &x, &y);
		g[x].push_back (y);
	}
	bool ok = 1;
	while (ok) {
		ok = 0;

		viz.reset ();
		
		for (i = 1; i <= n; i++)
			if (!l[i]) 
				if (cupleaza (i))
					++sol, ok = 1;
	}
	
	printf ("%d\n", sol);
	for (i = 1; i <= n; i++)
		if (l[i])
			printf ("%d %d\n", i, l[i]);
	return 0;
}