Cod sursa(job #2964198)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 12 ianuarie 2023 16:46:35
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e4;
const int MMAX = 1e4;

int n, m, e;
int le[NMAX + 1], ri[NMAX + 1];
vector<int> adj[NMAX + 1];
bool vis[NMAX + 1];

bool pairUp(int u) {
	if(vis[u]) {
		return 0;
	}

	vis[u] = 1;

	for(const auto &it: adj[u]) {
		if(!ri[it]) {
			ri[it] = u;
			le[u] = it;
			return 1;
		}
	}

	for(const auto &it: adj[u]) {
		if(pairUp(ri[it])) {
			ri[it] = u;
			le[u] = it;
			return 1;
		}
	}

	return 0;
}

int main() {
	ios_base :: sync_with_stdio(false);

	fin >> n >> m >> e;

	for(int i = 1; i <= e; i++) {
		int u, v;
		fin >> u >> v;

		adj[u].emplace_back(v);
	}

	// romanian match
	bool canMatch = 1;
	while(canMatch) {
		memset(vis, 0, sizeof(vis));

		canMatch = 0;
		for(int i = 1; i <= n; i++) {
			if(!le[i] && pairUp(i)) {
				canMatch = 1;
			}
		}
	}

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

	fout << maxMatch << '\n';

	for(int i = 1; i <= n; i++) {
		if(le[i]) {
			fout << i << " " << le[i] << '\n';
		}
	}

	fin.close();
	fout.close();
	return 0;
}