Cod sursa(job #941564)

Utilizator forgetHow Si Yu forget Data 19 aprilie 2013 03:24:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>
using namespace std;

vector<vector<int> > adjl;
vector<int> match1, match2;
vector<bool> visited;

bool dfs(int i)
{
	if (match2[i] == 0)
		return true;
	visited[i] = true;
	int a = match2[i];
	for (vector<int>::iterator it = adjl[a].begin(); it != adjl[a].end(); ++it) {
		if (!visited[*it]) {
			if (dfs(*it)) {
				match2[*it] = a;
				return true;
			}
		}
	}
	return false;
}

int main()
{
	ifstream fin("cuplaj.in");
	ofstream fout("cuplaj.out");
	int n, m, e;
	fin >> n >> m >> e;
	adjl.resize(n+1);
	match1.resize(n+1);
	match2.resize(m+1);
	visited.resize(m+1);
	int u, v;
	for (; e > 0; --e) {
		fin >> u >> v;
		adjl[u].push_back(v);
	}

	int cnt = 0;
	bool change;
	do {
		change = false;
		for (int i = 1; i <= n; ++i) {
			if (match1[i] == 0) {
				match2[0] = i;
				if (dfs(0)) {
					++cnt;
					change = true;
				}
			}
		}
		for (int i = 1; i <= m; ++i) {
			visited[i] = false;
			match1[match2[i]] = i;
		}
	} while (change);

	fout << cnt << '\n';
	for (int i = 1; i <= n; ++i)
		if (match1[i] != 0)
			fout << i << ' ' << match1[i] << '\n';
	return 0;
}