Cod sursa(job #972146)

Utilizator tudorv96Tudor Varan tudorv96 Data 11 iulie 2013 03:05:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <vector>
#include <list>
#include <iterator>
using namespace std;

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

vector <list <int> > g;
vector <int> A, B;
vector <bool> viz;
int a, b, m, sol;

bool match (int x) {
	if (viz[x])
		return 0;
	viz[x] = 1;
	for (list <int> :: iterator it = g[x].begin(); it != g[x].end(); ++it)
		if (!B[*it]) {
			B[*it] = x;
			A[x] = *it;
			return 1;
		}
	for (list <int> :: iterator it = g[x].begin(); it != g[x].end(); ++it)
		if (match (B[*it])) {
			A[x] = *it;
			B[*it] = x;
			return 1;
		}
	return 0;
}

int main() {
	fin >> a >> b >> m;
	A.resize(a+1);
	B.resize(b+1);
	g.resize(a+1);
	while (m--) {
		int x, y;
		fin >> x >> y;
		g[x].push_back(y);
	}
	fin.close();
	bool done = true;
	while (done) {
		done = 0;
		viz.assign(a+1, 0);
		for (int i = 1; i <= a; ++i)
			if (!A[i])
				done |= match(i);
	}
	for (int i = 1; i <= a; ++i)
		sol += (A[i] > 0);
	fout << sol << "\n";
	for (int i = 1; i <= a; ++i)
		if (A[i])
			fout << i << " " << A[i] << "\n";
	fout.close();
}