Cod sursa(job #301320)

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

using namespace std;

int n, m, e, i, j, a, b, sol;
vector <int> v[maxn];
int viz[2 * maxn];
int cup[2 * 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;
			return 1;
		}
	}
	
	for (i = 0; i < v[nod].size(); i++) {
		fiu = v[nod][i];
		if (cup[fiu])
			if (cupleaza(cup[fiu])) {
				cup[fiu] = nod;
				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);
	}
	
	for (i = 1; i <= n; i++) {
		memset(viz, 0, sizeof(viz));
		sol += cupleaza(i);
	}
	
	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;
}