Cod sursa(job #1058612)

Utilizator ELHoriaHoria Cretescu ELHoria Data 15 decembrie 2013 18:24:35
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

class MaxMatching {
	private :
	vector< vector<int> > G;
	int N;
	vector<int> L;
	vector<int> R;
	vector<bool> visited;

	bool match(const int &v) { 
		if (visited[v]) return false;
		visited[v] = true;
		for (const auto &w : G[v]) {
			if (R[w] == -1 || match(R[w])) {
				L[v] = w;
				R[w] = v;
				return true;
			}
		}

		return false;
	}

	public :
	MaxMatching(int n, int m) {
		N = n;
		int d = max(n, m);
		G.resize(d, vector<int>());
		visited.resize(d, false);
		L.resize(d, -1);
		R.resize(d, -1);
	}

	void addEdge(int x, int y) {
		G[x].push_back(y);
	}

	vector< pair<int,int> > getMatching() {
		vector< pair<int, int> > ret;
		for (bool change = true; change;) {
			change = false;
			fill(visited.begin(), visited.end(), false);
			for (int i = 0; i < N; i++) {
				if (L[i] == -1) {
					change |= match(i);
				}
			}
		}
		
		for (int i = 0; i < N; i++) {
			if (L[i] != -1) {
				ret.push_back(make_pair(i, L[i]));
			}
		}
		
		return ret;
	}
};


int main()
{
	ifstream cin("cuplaj.in");
	ofstream cout("cuplaj.out");
	int n, m, e;
	cin >> n >> m >> e;
	MaxMatching solver(n,m);
	int a, b;
	for (int i = 0; i < e; i++) {
		cin >> a >> b;
		a--, b--;
		solver.addEdge(a, b);
	}

	vector< pair<int, int> > ans = solver.getMatching();
	
	cout << ans.size() << "\n";
	for (const auto &e : ans) {
		cout << e.first + 1 << " " << e.second + 1 << "\n";
	}

	return 0;
}