Cod sursa(job #1493079)

Utilizator aimrdlAndrei mrdl aimrdl Data 28 septembrie 2015 18:24:08
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>
#include <string.h>
#include <vector>

using namespace std;

int N, M, E, L[10005], R[10005];
vector < vector <int> > V;
bool solved[10005];

void read() {
	scanf("%d %d %d", &N, &M, &E);
	
	V.resize(N+1);
	for (int i = 0; i < E; ++i) {
		int x, y;
		scanf ("%d %d", &x, &y);
		V[x].push_back(y);
	}
}

bool pairUp (int x) {
	if (solved[x]) return 0;
	
	solved[x] = true;
	
	vector <int>::iterator it;
	for (it = V[x].begin(); it != V[x].end(); ++it) {
		if (!R[*it] || pairUp(R[*it])) {
			R[*it] = x;
			L[x] = *it;
			return 1;
		}	
	}
	
	return 0;
}

int solve () {
	int c = 0;
	bool still = true;
	while (still) {
		still = false;
		memset(solved, false, (N+1) * sizeof(bool));
		for (int i = 1; i <= N; ++i) {
			if (R[i] == 0) {
				if (pairUp(i)) {
					++c;
					still = true;
				}
			}
		}
	}
	
	return c;
}

int main (void) {
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);
	
	read();
	
	int max = solve();
	printf("%d\n", max);
	for (int i = 1, j = 0; i <= N && j < max; ++i) {
		if (L[i]) {
			printf("%d %d\n", i, L[i]);
			++j;
		}
	}
	
	return 0;
}