Cod sursa(job #293421)

Utilizator CezarMocanCezar Mocan CezarMocan Data 1 aprilie 2009 20:34:51
Problema Cuplaj maxim in graf bipartit Scor 12
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#include <vector>
#define maxn 120
#define maxe 1000

using namespace std;

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

void df(int nod) {
	int i, j, fiu;
	
	if (viz[nod])
		return;
	viz[nod] = 1;
	
	if (nod <= n) {
	
		for (i = 0; i < v[nod].size(); i++) {
			fiu = v[nod][i];
			df(fiu);
			if (ok == 1) {
				cup[fiu] = nod;
				return;
			}
		}
		
	}
	else {
		//sunt in dreapta si nodu nu e cuplat
		if (cup[nod] == 0) {
			ok = 1;
			return;
		}
		else 
			df(cup[nod]);
	}
}

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);
//		v[b].push_back(a);
	}
	
	for (i = 1; i <= n; i++) {
		if (!cup[i]) {
			memset(viz, 0, sizeof(viz));
			ok = 0;
			df(i);
			sol += ok;
		}
	}
	
	printf("%d\n", sol);	
	for (i = n + 1; i <= n + m; i++)
		printf("%d %d\n", cup[i], i - n);
	
	return 0;
}