Cod sursa(job #1801251)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 8 noiembrie 2016 19:58:15
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

int baiat[10100], fata[10100];
int viz[10100];
vector <int> adia_b[10100], adia_f[10100];

bool cuplaj(int nod);

int main()
{
	ifstream in("cuplaj.in");
	int n, m, l, a, b;
	in >> n >> m >> l;

	while (l--) {
		in >> a >> b;
		adia_b[a].push_back(b);
		adia_f[b].push_back(a);
	}

	bool merge = 1;

	while (merge) {
		merge = 0;
		memset(viz, 0, sizeof viz);

		for (int i = 1; i <= n; i++) {
			if (!viz[i] && !baiat[i] && cuplaj(i))
				merge = 1;
		}
	}

	vector <pair <int, int> > r;
	for (int i = 1; i <= n; i++) {
		if (baiat[i] != 0)
			r.push_back({ i, baiat[i] });
	}

	ofstream out("cuplaj.out");

	out << r.size() << '\n';
	
	for (vector <pair <int, int> > :: iterator it = r.begin(); it != r.end(); it++)
		out << it->first << ' ' << it->second << '\n';

	return 0;
}

bool cuplaj(int nod)
{
	viz[nod] = 1;
	for (int & i : adia_b[nod]) {
		if (fata[i] == 0) {
			fata[i] = nod;
			baiat[nod] = i;
			return true;
		}
	}

	for (int & i : adia_b[nod]) {
		if (!viz[fata[i]] && cuplaj(fata[i])) {
			fata[i] = nod;
			baiat[nod] = i;
			return true;
		}
	}

	return false;
}