Cod sursa(job #398172)

Utilizator CezarMocanCezar Mocan CezarMocan Data 18 februarie 2010 07:29:51
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
//construiesc un graf bipartit cu nodurile din graful initial si in stanga si in dreapta
//fac cuplaj maxim in graful asta bipartit, trebuie sa fac cu Hopcroft ca sa imi intre in timp

#include <cstdio>
#include <vector>

#define maxn 20100

using namespace std;

vector <int> g[maxn];
int cup_st[maxn], cup_dr[maxn];
bool viz[maxn];
int n, m, e, ok, sol;
int a, b, i, j;

int cupleaza(int nod) {
	int i, fiu;
	if (viz[nod])	return 0;
	viz[nod] = 1;

	for (i = 0; i < g[nod].size(); i++) {
		fiu = g[nod][i];
		if (!cup_dr[fiu]) {
			cup_dr[fiu] = nod;
			cup_st[nod] = 1;
			return 1;
		}
	}	

	for (i = 0; i < g[nod].size(); i++) {
		fiu = g[nod][i];
		if (cup_dr[fiu])
			if (cupleaza(cup_dr[fiu])) {
				cup_dr[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, &e, &m);

	for (i = 1; i <= m; i++) {
		scanf("%d%d", &a, &b);
		g[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);


	return 0;
}