Cod sursa(job #2344603)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 15 februarie 2019 12:18:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
#include <string.h>

using namespace std;

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

const int MAXN = 1e4;
const int MAXM = 1e4;
const int MAXE = 1e5;

int n, m, e;
vector<int> g[MAXN + 1];
bool viz[MAXN + 1];
int cup_le[MAXN + 1], cup_ri[MAXN + 1];

bool cuplaj(int nod) {
	if (viz[nod]) return false;
	viz[nod] = true;

	for (auto x : g[nod]) {
		if (cup_le[x] == 0) {
			cup_le[x] = nod;
			cup_ri[nod] = x;
			return true;
		}
	}

	for (auto x : g[nod]) {
		if (cuplaj(cup_le[x])) {
			cup_le[x] = nod;
			cup_ri[nod] = x;
			return true;
		}
	}



	return false;
}

int main() {
	in >> n >> m >> e;

	for (int i = 1; i <= e; ++ i) {
		int a, b;
		in >> a >> b;
		g[a].push_back(b);
	}

	bool ok = true;

	while (ok) {
		ok = false;
		memset(viz, 0, sizeof(viz));

		for (int i = 1; i <= n; ++ i) {
			if (!cup_ri[i]) {
				ok |= cuplaj(i);
			}
		}
	}

	int cnt = 0;
	for (int i = 1; i <= n; ++ i) {
		if (cup_ri[i])
			++ cnt;
	}

	out << cnt << '\n';
	for (int i = 1; i <= n; ++ i) {
		if (cup_ri[i]) {
			out << i << ' ' << cup_ri[i] << '\n';
		}
	}

	return 0;
}