Cod sursa(job #3293891)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 12 aprilie 2025 23:24:12
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;

const int kNil = -1;

struct kuhn {
	int n, m;
	vector<vector<int>> adj;
	vector<int> l, r;
	vector<bool> vis;
	kuhn() {}
	kuhn(int n, int m) : n(n), m(m), adj(n), l(m, kNil), r(n, kNil), vis(n) {}
	void add_edge(int u, int v) {
		adj[u].emplace_back(v);
	}
	bool pairup(int u) {
		if(vis[u]) {
			return false;
		}
		vis[u] = true;
		for(const auto &it : adj[u]) {
			if(l[it] == kNil) {
				r[u] = it;
				l[it] = u;
				return true;
			}
		}
		for(const auto &it : adj[u]) {
			if(pairup(l[it])) {
				r[u] = it;
				l[it] = u;
				return true;
			}
		}
		return false;
	}
	int max_match() {
		bool better = true;
		while(better) {
			better = false;
			fill(vis.begin(), vis.end(), false);
			for(int i = 0; i < n; i++) {
				if(r[i] == kNil && pairup(i)) {
					better = true;
				}
			}
		}
		int res = 0;
		for(int i = 0; i < n; i++) {
			if(r[i] != kNil) {
				res++;
			}
		}
		return res;
	}
};

int main() {
	cin.tie(nullptr)->sync_with_stdio(false);
#ifdef INFOARENA
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);
#endif
	int n, m, e;
	cin >> n >> m >> e;
	kuhn graph(n, m);
	for(int i = 0; i < e; i++) {
		int u, v;
		cin >> u >> v;
		u--; v--;
		graph.add_edge(u, v);
	}
	cout << graph.max_match() << '\n';
	for(int i = 0; i < n; i++) {
		if(graph.r[i] != kNil) {
			cout << i + 1 << " " << graph.r[i] + 1 << '\n';
		}
	}
	return 0;
}