Cod sursa(job #293426)

Utilizator CezarMocanCezar Mocan CezarMocan Data 1 aprilie 2009 20:38:19
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
#include <cstring>
#include <vector>
#define maxn 10100
#define maxe 100100

using namespace std;

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

void df(int nod) {
	int i, 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) {
				cuplat[fiu] = nod;
				return;
			}
		}

	}
	else {
		//is in partea dreapta, daca nod nu e cuplat am gasit lant, altfel merg in ala cu care e cuplat
		if (cuplat[nod])
			df(cuplat[nod]);
		else {
			ok = 1;
			return;
		}
	}
}

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 <= e; i++) 
		if (!cuplat[i]) {
			ok = 0;
			memset(viz, 0, sizeof(viz));
			df(i);
			sol += ok;
		}

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

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

	return 0;
}