Cod sursa(job #1909690)

Utilizator lflorin29Florin Laiu lflorin29 Data 7 martie 2017 13:35:09
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

const int nMax = 1e4 + 2;

int n, m, e, l[nMax], r[nMax];
vector<int>g[nMax];
bool vis[nMax];

void read() {
	scanf("%d%d%d", &n, &m, &e);

	for (int i = 1; i <= e; ++i) {
		int from, to;
		scanf("%d%d", &from, &to);
		g[from].push_back(to);
	}
}

bool canMatch(int node) {
	if (vis[node])
		return false;
	vis[node] = true;

	for (const auto &itr : g[node]) {
		if (!l[itr] or canMatch(l[itr])) {
			r[node] = itr;
			l[itr] = node;
			return true;
		}
	}

	return false;
}

void maxMatching() {
	for (bool ok = 1; ok;) {
		ok = 0;
		memset(vis, 0, sizeof(vis));

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

void printMatching() {
	int card = 0;

	for (int i = 1; i <= n; ++i)
		if (r[i] != 0)
			card++;

	printf("%d\n", card);

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

int main() {
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);

	read();
	maxMatching();
	printMatching();
	return 0;
}