Cod sursa(job #301343)

Utilizator CezarMocanCezar Mocan CezarMocan Data 8 aprilie 2009 09:50:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <vector>
#define maxn 10100

using namespace std;

int n, m, e, i, j, a, b, sol, ok;
vector <int> v[maxn];
int viz[2 * maxn];
int cup[2 * maxn], cup_st[maxn];

int cupleaza(int nod) {
	int i, fiu;
	if (viz[nod] == 1)
		return 0;
	viz[nod] = 1;
	
	for (i = 0; i < v[nod].size(); i++) {
		fiu = v[nod][i];
		if (!cup[fiu]) {
			cup[fiu] = nod;
			cup_st[nod] = 1;
			return 1;
		}
	}
	
	for (i = 0; i < v[nod].size(); i++) {
		fiu = v[nod][i];
		if (cup[fiu])
			if (cupleaza(cup[fiu])) {
				cup[fiu] = nod;
				cup_st[nod] = 1;
				return 1;
			}
	}
	
	return 0;
}

int main() {
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);
	
	scanf("%d%d%d", &n, &m, &e);
	for (i = 1; i <= e; i++) {
		scanf("%d%d", &a, &b);
		b += n;
		v[a].push_back(b);
	}
	
	ok = 1;
	while (ok) {
		ok = 0;
		memset(viz, 0, sizeof(viz));
		
		for (i = 1; i <= n; i++) 
			if (!cup_st[i])
				if (cupleaza(i)) {
					sol++;
					ok = 1;
				}
	}
	
	printf("%d\n", sol);
	for (i = n + 1; i <= n + m; i++)
		if (cup[i]) {
			printf("%d %d\n", cup[i], i - n);
		}
	
	return 0;
}