Cod sursa(job #318139)

Utilizator wefgefAndrei Grigorean wefgef Data 26 mai 2009 23:33:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

const int MAX_N = 10005;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int n, m, e;
vector<int> v[MAX_N];
int l_pair[MAX_N], r_pair[MAX_N];
bool vis[MAX_N];

void read() {
	fin >> n >> m >> e;
	for (int i = 0; i < e; ++i) {
		int a, b;
		fin >> a >> b;
		v[a].push_back(b);
	}
}

int cupleaza(int nod) {
	if (vis[nod]) return 0;
	vis[nod] = true;

	for (vector<int>::iterator it = v[nod].begin(); it != v[nod].end(); ++it)
		if (!r_pair[*it]) {
			l_pair[nod] = *it;
			r_pair[*it] = nod;
			return 1;
		}

	for (vector<int>::iterator it = v[nod].begin(); it != v[nod].end(); ++it)
		if (r_pair[*it] && cupleaza(r_pair[*it])) {
			l_pair[nod] = *it;
			r_pair[*it] = nod;
			return 1;
		}

	return 0;
}

void solve() {
	int sol = 0;

	bool ok = true;
	while (ok) {
		ok = false;
		memset(vis, 0, sizeof(vis));

		for (int i = 1; i <= n; ++i)
			if (!l_pair[i] && cupleaza(i)) {
				ok = true;
				++sol;
			}
	}

	fout << sol << "\n";
	for (int i = 1; i <= n; ++i)
		if (l_pair[i])
			fout << i << " " << l_pair[i] << "\n";
}

int main() {
	read();
	solve();
}