Cod sursa(job #262542)

Utilizator tvladTataranu Vlad tvlad Data 19 februarie 2009 14:24:42
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
#include <vector>
using namespace std;

const int NMAX = 10001;
const int MMAX = NMAX;

int n,m,e;
vector<int> G[NMAX];
int match[NMAX], ret[MMAX];
bool used[NMAX];

int pairup ( int k ) {
	if (used[k]) return 0;
	used[k] = true;
	for (vector<int>::iterator i = G[k].begin(); i != G[k].end(); ++i) {
		if (ret[*i] == 0) {
			match[k] = *i;
			ret[*i] = k;
			return 1;
		}
	}
	for (vector<int>::iterator i = G[k].begin(); i != G[k].end(); ++i) {
		if (pairup(ret[*i])) {
			match[k] = *i;
			ret[*i] = k;
			return 1;
		}
	}
	return 0;
}

int main() {
	freopen("cuplaj.in","rt",stdin);
	freopen("cuplaj.out","wt",stdout);
	scanf("%d %d %d",&n,&m,&e);
	for (int i = 0, a,b; i < e; ++i) {
		scanf("%d %d",&a,&b);
		G[a].push_back(b);
	}

	for (bool ok = true; ok; ) {
		ok = false;
		fill(used,used+n,false);
		for (int i = 1; i <= n; ++i)
			if (match[i] == 0)
				ok |= (bool)pairup(i);
	}

	int cuplaj = 0;
	for (int i = 1; i <= n; ++i) cuplaj += (match[i] != 0);
	printf("%d\n",cuplaj);
	for (int i = 1; i <= n; ++i)
		if (match[i] != 0)
			printf("%d %d\n",i,match[i]);
}