Cod sursa(job #1228571)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 14 septembrie 2014 16:55:51
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>
#define DIM 10005
#define vint vector<int>::iterator
#define infile "cuplaj.in"
#define outfile "cuplaj.out"

using namespace std;

ifstream f(infile);
ofstream g(outfile);

vector<int> V[DIM];

int L[DIM], R[DIM];

int n1, n2, m, a, b;

bool viz[DIM];

bool cuplaj(int nod) {
	if (viz[nod])
		return false;
	viz[nod] = true;
	for (vint it = V[nod].begin(); it != V[nod].end(); ++it)
	if (R[*it] == 0) {
		R[*it] = nod;
		L[nod] = *it;
		return true;
	}
	for (vint it = V[nod].begin(); it != V[nod].end(); ++it)
	if (cuplaj(R[*it])) {
		R[*it] = nod;
		L[nod] = *it;
		return true;
	}
	return false;
}

int main() {
	f >> n1 >> n2 >> m;
	for (int i = 1; i <= m; ++i) {
		f >> a >> b;
		V[a].push_back(b);
	}
	bool ok;
	int sol = 0;
	do {
		ok = false;
		for (int i = 1; i <= n1; ++i)
			viz[i] = false;
		for (int i = 1; i <= n1; ++i)
		if (L[i] == 0 && cuplaj(i)) {
			++sol;
			ok = true;
		}
	} while (ok);
	g << sol << "\n";
	for (int i = 1; i <= n1; ++i)
	if (L[i] != 0)
		g << i << " " << L[i] << "\n";
	return 0;
}

//This room. This bullet. There's a bullet for everyone. And a time. And a place. Yes... maybe this is how it has to be. - 47