Cod sursa(job #567863)

Utilizator cosmyoPaunel Cosmin cosmyo Data 30 martie 2011 15:54:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>
#include <vector>
using namespace std;
const int N = 10005;
int n, m, e, l[N], r[N], v[N];
vector<int> a[N];

int pairup(int k) {
	int i;
	if(v[k])
		return 0;
	v[k] = 1;
	for(i = 0; i < a[k].size(); ++i) 
		if(!r[a[k][i]]) {
			l[k] = a[k][i];
			r[a[k][i]] = k;
			return 1;
		}
	
	for(i = 0; i < a[k].size(); ++i) 
		if(r[a[k][i]] && pairup(r[a[k][i]])) {
			l[k] = a[k][i];
			r[a[k][i]] = k;
			return 1;
		}
	
	return 0;
}

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

	for(i = 1; i <= e; ++i) {
		scanf("%d %d", &x, &y);
		a[x].push_back(y);
	}

	int ok = 1;

	while(ok) {
		ok = 0;
		memset(v, 0, sizeof(v));
		for(i = 1; i <= n; ++i)
			if(!l[i] && pairup(i))
				ok |= 1;
	}

	int r = 0;

	for(i = 1; i <= n; ++i)
		r += (l[i] > 0);

	printf("%d\n", r);

	for(i = 1; i <= n; ++i)
		if(l[i])
			printf("%d %d\n", i, l[i]);

	return 0;
}